diff options
Diffstat (limited to 'examples')
27 files changed, 747 insertions, 0 deletions
diff --git a/examples/org.eclipse.swt.examples.browser.demos/.classpath b/examples/org.eclipse.swt.examples.browser.demos/.classpath new file mode 100644 index 0000000000..065ac06e19 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/.classpath @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/examples/org.eclipse.swt.examples.browser.demos/.project b/examples/org.eclipse.swt.examples.browser.demos/.project new file mode 100644 index 0000000000..db0b47df6f --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.swt.examples.BrowserDemo</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/examples/org.eclipse.swt.examples.browser.demos/about.html b/examples/org.eclipse.swt.examples.browser.demos/about.html new file mode 100644 index 0000000000..9db411aab9 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/about.html @@ -0,0 +1,30 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> +<html> +<head> +<title>About</title> +<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1"> +</head> +<body lang="EN-US"> +<h2>About This Content</h2> + +<p>20th June, 2002</p> +<h3>License</h3> +<p>Eclipse.org makes available all content in this plug-in ("Content"). Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the +Common Public License Version 1.0 ("CPL"). A copy of the CPL is available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>. +For purposes of the CPL, "Program" will mean the Content.</p> + +<h3>Contributions</h3> + +<p>If this Content is licensed to you under the terms and conditions of the CPL, any Contributions, as defined in the CPL, uploaded, submitted, or otherwise +made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such +Content are provided under the terms and conditions of the CPL and can be made available to others under the terms of the CPL.</p> + +<p>If this Content is licensed to you under license terms and conditions other than the CPL ("Other License"), any modifications, enhancements and/or +other code and/or documentation ("Modifications") uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the +host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available +to others under the terms of the Other License. In addition, with regard to Modifications for which you are the copyright holder, you are also +providing the Modifications under the terms and conditions of the CPL and such Modifications can be made available to others under the terms of +the CPL.</p> + +</body> +</html>
\ No newline at end of file diff --git a/examples/org.eclipse.swt.examples.browser.demos/build.properties b/examples/org.eclipse.swt.examples.browser.demos/build.properties new file mode 100644 index 0000000000..235cbf7eb7 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/build.properties @@ -0,0 +1,7 @@ +source.BrowserDemo.jar = src/ +output.BrowserDemo.jar = bin/ +bin.includes = plugin.xml,\ + BrowserDemo.jar,\ + css1/,\ + css2/,\ + icons/ diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/back1.jpg b/examples/org.eclipse.swt.examples.browser.demos/css1/back1.jpg Binary files differnew file mode 100644 index 0000000000..bab9f33410 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/back1.jpg diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/back2.jpg b/examples/org.eclipse.swt.examples.browser.demos/css1/back2.jpg Binary files differnew file mode 100644 index 0000000000..83f68de754 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/back2.jpg diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/black.gif b/examples/org.eclipse.swt.examples.browser.demos/css1/black.gif Binary files differnew file mode 100644 index 0000000000..976c1e9377 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/black.gif diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/board1.jpg b/examples/org.eclipse.swt.examples.browser.demos/css1/board1.jpg Binary files differnew file mode 100644 index 0000000000..0cc4d5e0e8 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/board1.jpg diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/empty.gif b/examples/org.eclipse.swt.examples.browser.demos/css1/empty.gif Binary files differnew file mode 100644 index 0000000000..a6bce4dac9 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/empty.gif diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/line1.gif b/examples/org.eclipse.swt.examples.browser.demos/css1/line1.gif Binary files differnew file mode 100644 index 0000000000..f9a0f34ecf --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/line1.gif diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/style.css b/examples/org.eclipse.swt.examples.browser.demos/css1/style.css new file mode 100644 index 0000000000..78215a1c08 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/style.css @@ -0,0 +1,29 @@ +body {background: url(./back2.jpg) fixed; font-size: 10pt; font-family:Verdana, Arial, Helv, Helvetica, sans-serif;}
+h1 {text-align: center; font-size: 14pt; font-family: Verdana, Arial, Helv, Helvetica, sans-serif;}
+h2 {background: url(./line1.gif) no-repeat right bottom; font-size: 12pt; font-family:Verdana, Arial, Helv, Helvetica, sans-serif;}
+h3 {font-size: 10pt; font-family:Verdana, Arial, Helv, Helvetica, sans-serif;}
+
+ul {list-style: none; padding: 0; margin:0; font: 12pt Times;}
+li.white {background: url(./white.gif) no-repeat; padding: 3px 0 32px 64px; margin: 0;}
+li.black {background: url(./black.gif) no-repeat; padding: 3px 0 32px 64px; margin: 0;}
+li.wall {background: url(./wall.gif) no-repeat; padding: 3px 0 32px 64px; margin: 0;}
+
+.board {text-align: center;}
+table { border-collapse: collapse; margin: 0;}
+tr {}
+td {height: 32px; width:32px; table-layout: fixed;}
+
+.whitelink a {display: block; background: url(./empty.gif) no-repeat; width:32px; height:32px;}
+.blacklink a {display: block; background: url(./empty.gif) no-repeat; width:32px; height:32px;}
+
+.whitelink a:hover {display: block; background: url(./white.gif) no-repeat; width:32px; height:32px;}
+.blacklink a:hover {display: block; background: url(./black.gif) no-repeat; width:32px; height:32px;}
+.white {background: url(./white.gif) no-repeat;}
+.black {background: url(./black.gif) no-repeat;}
+.wall {background: url(./wall.gif) no-repeat;}
+
+.playerwhite {float: left; margin: 1em 1em; border: 1px solid gray; background: url(./white.gif) no-repeat; text-align: right; width:100px; height:32px;}
+.playerblack {float: right; margin: 1em 1em; border: 1px solid gray; background: url(./black.gif) no-repeat; text-align: right; width:100px; height:32px;}
+
+.winner {border: 4px solid blue; font: bold 16pt Times, serif;}
+.loser {border: 1px solid black; font: 12pt Times, serif;}
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/wall.gif b/examples/org.eclipse.swt.examples.browser.demos/css1/wall.gif Binary files differnew file mode 100644 index 0000000000..fb97fc10e8 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/wall.gif diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/welcome.html b/examples/org.eclipse.swt.examples.browser.demos/css1/welcome.html new file mode 100644 index 0000000000..1e85ae6dc5 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/welcome.html @@ -0,0 +1,32 @@ +<html> +<head> + <title>Start a game</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link rel="stylesheet" type="text/css" href="./style.css"> +</head> +<body> +<h1>Pawns Game</h1> +<div class="start"> +<a class="start" href="http://www.org.eclipse.swt.examples.browser.demos.pawns/actionstart1player">1 player</a> +<a class="start" href="http://www.org.eclipse.swt.examples.browser.demos.pawns/actionstart2players">2 players</a> +</div> +<h2>How to play</h2> +This board game is a variant of Reversi and Tic Tac Toe. Each one of the two players sets a pawn on an empty cell of the board. +<h3>Pawns</h3> +<ul> +<li class="white">Player 1</li> +<li class="black">Player 2</li> +<li class="wall">Wall. Cannot be reversed.</li> +</ul> +<div class="theme"> +Different themes are supported. Theme is configured through a Cascading Style Sheet (CSS) that determines how the HTML content is rendered by the SWT Browser widget. +<ul class="theme"> +<li><a href="http://www.org.eclipse.swt.examples.browser.demos.pawns/actiontheme/css1">Theme 1</a></li> +<li><a href="http://www.org.eclipse.swt.examples.browser.demos.pawns/actiontheme/css2">Theme 2</a></li> +</ul> + +</div> +<h2>How to win</h2> +The game ends when all cells are filled. The winner is the one with most pawns of their colour. +</body> +</html>
\ No newline at end of file diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/white.gif b/examples/org.eclipse.swt.examples.browser.demos/css1/white.gif Binary files differnew file mode 100644 index 0000000000..c43fd96602 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css1/white.gif diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/back2.png b/examples/org.eclipse.swt.examples.browser.demos/css2/back2.png Binary files differnew file mode 100644 index 0000000000..6c49d9ffdd --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css2/back2.png diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/black.png b/examples/org.eclipse.swt.examples.browser.demos/css2/black.png Binary files differnew file mode 100644 index 0000000000..ad466cf198 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css2/black.png diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/empty.png b/examples/org.eclipse.swt.examples.browser.demos/css2/empty.png Binary files differnew file mode 100644 index 0000000000..d6ed8e03c2 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css2/empty.png diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/line1.gif b/examples/org.eclipse.swt.examples.browser.demos/css2/line1.gif Binary files differnew file mode 100644 index 0000000000..f9a0f34ecf --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css2/line1.gif diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/style.css b/examples/org.eclipse.swt.examples.browser.demos/css2/style.css new file mode 100644 index 0000000000..41a86d8351 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css2/style.css @@ -0,0 +1,29 @@ +body {background: url(./back2.png) fixed; font-size: 10pt; font-family:Verdana, Arial, Helv, Helvetica, sans-serif;}
+h1 {text-align: center; font-size: 14pt; font-family: Verdana, Arial, Helv, Helvetica, sans-serif;}
+h2 {background: url(./line1.gif) no-repeat right bottom; font-size: 12pt; font-family:Verdana, Arial, Helv, Helvetica, sans-serif;}
+h3 {font-size: 10pt; font-family:Verdana, Arial, Helv, Helvetica, sans-serif;}
+
+ul {list-style: none; padding: 0; margin:0; font: 12pt Times;}
+li.white {background: url(./white.png) no-repeat; padding: 3px 0 32px 64px; margin: 0;}
+li.black {background: url(./black.png) no-repeat; padding: 3px 0 32px 64px; margin: 0;}
+li.wall {background: url(./wall.png) no-repeat; padding: 3px 0 32px 64px; margin: 0;}
+
+.board {text-align: left;}
+table { border-collapse: collapse; margin: 0; padding:0}
+tr {}
+td {height:48px; width:48px; table-layout: fixed;}
+
+.whitelink a {display: block; background: url(./empty.png) no-repeat; width:48px; height:48px;}
+.blacklink a {display: block; background: url(./empty.png) no-repeat; width:48px; height:48px;}
+
+.whitelink a:hover {display: block; background: url(./white.png) no-repeat; width:48px; height:48px;}
+.blacklink a:hover {display: block; background: url(./black.png) no-repeat; width:48px; height:48px;}
+.white {background: url(./white.png) no-repeat;}
+.black {background: url(./black.png) no-repeat;}
+.wall {background: url(./wall.png) no-repeat;}
+
+.playerwhite {position: absolute; top: 50px; right:10px; margin: 1em 10px; border: 3px solid yellow; background: url(./white.png) no-repeat right; text-align: left; width:100px; height:48px; font: 36pt Times, serif;}
+.playerblack {position: absolute; top: 300px; right:10px; margin: 1em 10px; border: 3px solid yellow; background: url(./black.png) no-repeat right; text-align: left; width:100px; height:48px; font: 36pt Times, serif;}
+
+.winner {border: 4px solid blue; font: bold 16pt Times, serif;}
+.loser {border: 1px solid black; font: 12pt Times, serif;}
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/wall.png b/examples/org.eclipse.swt.examples.browser.demos/css2/wall.png Binary files differnew file mode 100644 index 0000000000..a38a12c7c4 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css2/wall.png diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/welcome.html b/examples/org.eclipse.swt.examples.browser.demos/css2/welcome.html new file mode 100644 index 0000000000..1e85ae6dc5 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css2/welcome.html @@ -0,0 +1,32 @@ +<html> +<head> + <title>Start a game</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link rel="stylesheet" type="text/css" href="./style.css"> +</head> +<body> +<h1>Pawns Game</h1> +<div class="start"> +<a class="start" href="http://www.org.eclipse.swt.examples.browser.demos.pawns/actionstart1player">1 player</a> +<a class="start" href="http://www.org.eclipse.swt.examples.browser.demos.pawns/actionstart2players">2 players</a> +</div> +<h2>How to play</h2> +This board game is a variant of Reversi and Tic Tac Toe. Each one of the two players sets a pawn on an empty cell of the board. +<h3>Pawns</h3> +<ul> +<li class="white">Player 1</li> +<li class="black">Player 2</li> +<li class="wall">Wall. Cannot be reversed.</li> +</ul> +<div class="theme"> +Different themes are supported. Theme is configured through a Cascading Style Sheet (CSS) that determines how the HTML content is rendered by the SWT Browser widget. +<ul class="theme"> +<li><a href="http://www.org.eclipse.swt.examples.browser.demos.pawns/actiontheme/css1">Theme 1</a></li> +<li><a href="http://www.org.eclipse.swt.examples.browser.demos.pawns/actiontheme/css2">Theme 2</a></li> +</ul> + +</div> +<h2>How to win</h2> +The game ends when all cells are filled. The winner is the one with most pawns of their colour. +</body> +</html>
\ No newline at end of file diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/white.png b/examples/org.eclipse.swt.examples.browser.demos/css2/white.png Binary files differnew file mode 100644 index 0000000000..9d28855043 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/css2/white.png diff --git a/examples/org.eclipse.swt.examples.browser.demos/icons/sample.gif b/examples/org.eclipse.swt.examples.browser.demos/icons/sample.gif Binary files differnew file mode 100644 index 0000000000..34fb3c9d8c --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/icons/sample.gif diff --git a/examples/org.eclipse.swt.examples.browser.demos/plugin.xml b/examples/org.eclipse.swt.examples.browser.demos/plugin.xml new file mode 100644 index 0000000000..b013a1968e --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/plugin.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.0"?> +<plugin + id="org.eclipse.swt.examples.browser.demos.BrowserDemo" + name="BrowserDemo Plug-in" + version="1.0.0" + provider-name="SWT" + class="org.eclipse.swt.examples.browser.demos.BrowserDemoPlugin"> + + <runtime> + <library name="BrowserDemo.jar"> + <export name="*"/> + </library> + </runtime> + + <requires> + <import plugin="org.eclipse.ui"/> + <import plugin="org.eclipse.core.runtime"/> + </requires> + + <extension + point="org.eclipse.ui.views"> + <category + name="Browser" + id="org.eclipse.swt.examples.browser.demos.BrowserDemo"> + </category> + <view + allowMultiple="false" + class="org.eclipse.swt.examples.browser.demos.views.BrowserDemoView" + icon="icons/sample.gif" + category="org.eclipse.swt.examples.browser.demos.BrowserDemo" + name="Browser Demo" + id="org.eclipse.swt.examples.browser.demos.views.BrowserDemoView"> + </view> + </extension> + <extension + point="org.eclipse.ui.perspectiveExtensions"> + <perspectiveExtension + targetID="org.eclipse.ui.resourcePerspective"> + <view + ratio="0.5" + relative="org.eclipse.ui.views.TaskList" + relationship="right" + id="org.eclipse.swt.examples.browser.demos.BrowserDemo.views.BrowserDemoView"> + </view> + </perspectiveExtension> + </extension> + +</plugin> diff --git a/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/BrowserDemoPlugin.java b/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/BrowserDemoPlugin.java new file mode 100644 index 0000000000..5eb8805c51 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/BrowserDemoPlugin.java @@ -0,0 +1,49 @@ +package org.eclipse.swt.examples.browser.demos; + +import org.eclipse.ui.plugin.*; +import org.osgi.framework.BundleContext; +import java.util.*; +import org.eclipse.core.runtime.*; + +public class BrowserDemoPlugin extends AbstractUIPlugin { + + public static BrowserDemoPlugin plugin; + ResourceBundle resourceBundle; + public static String PLUGIN_PATH = null; + + public BrowserDemoPlugin() { + super(); + plugin = this; + try { + resourceBundle = ResourceBundle.getBundle("org.eclipse.swt.examples.browser.demos.BrowserDemoPluginResources"); + } catch (MissingResourceException x) { + resourceBundle = null; + } + } + + public void start(BundleContext context) throws Exception { + super.start(context); + PLUGIN_PATH = Platform.resolve(plugin.getBundle().getEntry(".")).toString(); + } + + public void stop(BundleContext context) throws Exception { + super.stop(context); + } + + public static BrowserDemoPlugin getDefault() { + return plugin; + } + + public static String getResourceString(String key) { + ResourceBundle bundle = BrowserDemoPlugin.getDefault().getResourceBundle(); + try { + return (bundle != null) ? bundle.getString(key) : key; + } catch (MissingResourceException e) { + return key; + } + } + + public ResourceBundle getResourceBundle() { + return resourceBundle; + } +} diff --git a/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/Pawns.java b/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/Pawns.java new file mode 100644 index 0000000000..cb08f32584 --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/Pawns.java @@ -0,0 +1,222 @@ +package org.eclipse.swt.examples.browser.demos; + +public class Pawns { + + /* Current board representation in compacted form */ + byte[] game = new byte[64]; + /* Best move */ + int bestIndex = -1; + /* Related best score */ + int bestScore = Integer.MIN_VALUE; + /* Estimated strategic value of each cell based on proximity to walls */ + static int[] gameWallWeight = new int[64]; + Thread thread = null; + boolean threadStop = false; + + final static byte EMPTY = 0; + final static byte WHITE = 1; + final static byte BLACK = 2; + final static byte WALL = 3; + +public Pawns() { +} + +/* Provide the current game and ignitiate the search of the best move for the given type + * Must return immediately as it will be called from the UI thread. + * The UI thread will fetch the best move any time thereafter. + */ +public void playRequest(byte[][] game, int type) { + threadStop = true; + synchronized (this) { + bestIndex = -1; + bestScore = Integer.MIN_VALUE; + convert(game, this.game); + initPawnBorders(this.game, gameWallWeight); + /* Quickly compute a legal move */ + for (int i = 0; i < this.game.length; i++) { + if (this.game[i] == EMPTY) { + bestIndex = i; + break; + } + } + new Thread() { + public void run() { + synchronized(Pawns.this) { + threadStop = false; + int[] result = new int[2]; + /* if long time, must check for threadStop and exit early */ + evalBest(Pawns.this.game, BLACK, 2, result); + bestIndex = result[0]; + bestScore = result[1]; + } + } + }.start(); + } +} + +/* Fetch best move in natural coordinates for the board previously given in + * the call to playRequest. + */ +public void getBestMove(int[] point) { + convert(bestIndex, point); + threadStop = true; +} + +/* Given an expanded representation of the board, format internal compact mode */ +static void convert(byte[][] board, byte[] g) { + for (int i = 0; i < board.length; i++) System.arraycopy(board[i], 0, g, i * 8, 8); +} +/* Update given compact model based on player move in natural coordinates */ +static void set(byte[] g, int x, int y, byte type) { + g[x*8+y] = type; +} +/* Given an index in compact representation, return natural coordinates */ +static void convert(int index, /*out [0] x [1] y */int[] point) { + point[0] = index / 8; + point[1] = index % 8; +} +/* Given an index into the compact model and the neighbour code, + * return the index of the corresponding neighbour index. + * Returns -1 if there is no neighbour. + * + * Neighbour code for the index X + * 0 1 2 + * 3 X 4 + * 5 6 7 + */ +static int getNeighbourIndex(byte[] g, int index, int neighbour) { + if (index < 0 || index >= g.length) return -1; + int result = -1; + switch (neighbour) { + case 0: result = index < 8 || index % 8 == 0 ? -1 : index - 9; break; + case 1: result = index < 8 ? -1 : index - 8; break; + case 2: result = index < 8 || index % 8 == 7 ? -1 : index - 7; break; + case 3: result = index % 8 == 0 ? -1 : index - 1; break; + case 4: result = index % 8 == 7 ? -1 : index + 1; break; + case 5: result = index % 8 == 0 || index >= 56 ? -1 : index + 7; break; + case 6: result = index >= 56 ? -1 : index + 8; break; + case 7: result = index % 8 == 7 || index >= 56 ? -1 : index + 9; break; + } + return result; +} +/* Make the player type play at index on given compact board + * Compute all pawns that must be reversed. + */ +static void play(byte[] g, int index, byte type) { + byte opponentType = type == WHITE ? BLACK : WHITE; + for (int neighbour = 0; neighbour <= 7; neighbour++) { + int nIndex = getNeighbourIndex(g, index, neighbour); + int[] reversiIndeces = new int[6]; + int nReversi = 0; + while (nIndex != -1 && nReversi < 6 && g[nIndex] == opponentType) { + reversiIndeces[nReversi] = nIndex; + nReversi++; + nIndex = getNeighbourIndex(g, nIndex, neighbour); + } + if (nReversi > 0 && nIndex != -1 && g[nIndex] == type) { + for (int i = 0; i < nReversi; i++) g[reversiIndeces[i]] = type; + } + } + g[index] = type; +} +/* Evaluate the given compact model based on pawns distribution + * High means white has advantage. Below zero means black has advantage. + */ +static int eval(byte[] g) { + int cntWhite = 0, cntBlack = 0, cntEmpty = 0; + int cntWhiteWallAdvantage = 0, cntBlackWallAdvantage = 0; + for (int i = 0; i < 64; i++) { + if (g[i] == WHITE) { + cntWhite++; + cntWhiteWallAdvantage += gameWallWeight[i]; + } + else if (g[i] == BLACK) { + cntBlack++; + cntBlackWallAdvantage += gameWallWeight[i]; + } + else if (g[i] == EMPTY) cntEmpty++; + } + if (cntEmpty == 0) { + if (cntWhite > cntBlack) return Integer.MAX_VALUE; /* White wins */ + if (cntWhite < cntBlack) return Integer.MIN_VALUE; /* Black wins */ + return 0; /* Stalemate */ + } + return cntWhite + cntWhiteWallAdvantage - cntBlack - cntBlackWallAdvantage; +} + +/* Recognize pawns protected by walls or borders + * TBD - note this should be called only once for each cell and stored + * in a separate byte[] gWallGain + * */ +static void initPawnBorders(byte[] g, int[] gameWallWeight) { + /* A pawn has 8 neighbours on 4 axes. + * Strategic pawns have one side of each axis protected by a wall and the other + * side not closed by a wall. + * A pawn cannot be reversed when each of its 4 axes are protected by a wall on + * one side. Pawns that have more than 4 walls are less interesting since they + * are not open enough to the board. + * + * Nbr walls, nbr axis covered, estimated value + * 0 n/a 0 + * 1 1 2 + * 2 1 1 + * 2 2 6 + * 3 2 4 + * 4 2 2 + * 3 3 9 + * 4 3 8 + * 4 4 16 + * 5 4 14 + * 6 4 9 + * 7 4 6 + * 8 4 0 + */ + int[] nTypes = new int[8]; + for (int i = 0; i < 64; i++) { + int nWalls = 0; + int nAxis = 0; + for (int n = 0; n < 8; n++) { + int nIndex = getNeighbourIndex(g, i, n); + nTypes[n] = nIndex != -1 ? g[nIndex] : WALL; + if (nTypes[n] == WALL) nWalls++; + } + int score = nWalls; + if (nWalls > 0) { + if (nTypes[0] == WALL || nTypes[7] == WALL) nAxis++; + if (nTypes[1] == WALL || nTypes[6] == WALL) nAxis++; + if (nTypes[2] == WALL || nTypes[5] == WALL) nAxis++; + if (nTypes[4] == WALL || nTypes[3] == WALL) nAxis++; + switch (nAxis) { + case 4: switch (nWalls) { case 4: score = 16; break; case 5: score = 14; break; case 6: score = 9; case 7: score = 6; break; case 8: score = 0; break;}; break; + case 3: switch (nWalls) { case 3: score = 9; break; case 4: score = 8;}; break; + case 2: switch (nWalls) { case 2: score = 6; break; case 3: score = 4; break; case 4: score = 2; }; break; + case 1: switch (nWalls) { case 1: score = 2; break; case 2: score = 1; break;}; break; + }; + } + gameWallWeight[i] = score; + } +} + +/* Evaluate the best move for player type for the given board, doing a depth 1 search */ +static void evalBest(byte[] g, byte type, int depth, /* out [0] best move, [1] minimax */int[] result) { + byte[] tmp = new byte[64]; + byte opponentType = type == WHITE ? BLACK : WHITE; + result[0] = -1; result[1] = Integer.MIN_VALUE; + for (int i = 0; i < 64; i++) { + if (g[i] == EMPTY) { + System.arraycopy(g, 0, tmp, 0, 64); + play(tmp, i, type); + int score = eval(tmp); + if (depth > 1) { + int[] tmpResult = new int[2]; + evalBest(tmp, opponentType, depth - 1, tmpResult); + score = tmpResult[1]; + } + if ((type == WHITE && score > result[1]) || (type == BLACK && score < result[1]) || result[0] == -1) { + result[0] = i; + result[1] = score; + } + } + } +} +}
\ No newline at end of file diff --git a/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/views/BrowserDemoView.java b/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/views/BrowserDemoView.java new file mode 100644 index 0000000000..b56d49b02b --- /dev/null +++ b/examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/views/BrowserDemoView.java @@ -0,0 +1,233 @@ +package org.eclipse.swt.examples.browser.demos.views; + +import org.eclipse.ui.part.*; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.*; +import org.eclipse.swt.browser.*; +import org.eclipse.swt.widgets.*; +import org.eclipse.swt.examples.browser.demos.*; + +public class BrowserDemoView extends ViewPart { + Browser browser = null; + ReversiListener reversiListener; + + final static int TYPE_WELCOME = 1; + final static int TYPE_START = 2; + final static int TYPE_BOARD = 3; + final static int TYPE_BOARD_OVER = 4; + + final static String URL = "http://www.org.eclipse.swt.examples.browser.demos.pawns/"; + static String PLUGIN_PATH = BrowserDemoPlugin.PLUGIN_PATH; + static String CSS_FOLDER = "css1"; + static String URL_CSS = PLUGIN_PATH+CSS_FOLDER+"/style.css"; + static String URL_WELCOME =PLUGIN_PATH+CSS_FOLDER+"/welcome.html"; + + final static String ACTION_START_2_PLAYERS = "actionstart2players"; + final static String ACTION_START_1_PLAYER = "actionstart1player"; + final static String ACTION_WHITE = "actionwhite"; + final static String ACTION_BLACK = "actionblack"; + final static String ACTION_BLACK_COMPUTER = "actionblackcomputer"; + final static String ACTION_THEME = "actiontheme"; + + static byte[][] game = null; + static boolean isWhite = true; + static int cntWhite = 0, cntBlack = 0; + static boolean computer = false; + static int cx, cy; + final static byte EMPTY = 0; + final static byte WHITE = 1; + final static byte BLACK = 2; + final static byte WALL = 3; + + static Pawns ttr = null; + static int[] move = new int[2]; + + public BrowserDemoView() { + } + public void createPartControl(Composite parent) { + try { + browser = new Browser(parent, SWT.NONE); + } catch (SWTError e) { + e.printStackTrace(); + return; + } + reversiListener = new ReversiListener(); + browser.addLocationListener(reversiListener); + browser.setUrl(URL_WELCOME); + + } + private void showMessage(String message) { + MessageDialog.openInformation( + browser.getShell(), + "Browser Demo", + message); + } + public void setFocus() { + browser.setFocus(); + } + + static String getHtml(int type) { + String html = null; + switch (type) { + case TYPE_BOARD: + case TYPE_BOARD_OVER: { + html = "<html><header><link rel=\"stylesheet\" type=\"text/css\" href=\""+URL_CSS+"\"></header><body><div class=\"board\"><table><tbody>"; + String classPlayerWhite = "playerwhite", classPlayerBlack = "playerblack"; + if (type == TYPE_BOARD_OVER) { + if (cntWhite > cntBlack) { + classPlayerWhite += " winner"; + classPlayerBlack += " loser"; + } else { + classPlayerWhite += " loser"; + classPlayerBlack += " winner"; + } + } + for (int i = 0; i < game.length; i++) { + html += "<tr>"; + for (int j = 0; j < game[0].length; j++) { + switch (game[i][j]) { + case EMPTY: html += "<td class=\""+(isWhite ? "whitelink" : "blacklink")+"\"><a href=\""+URL+(isWhite ? ACTION_WHITE : computer ? ACTION_BLACK_COMPUTER : ACTION_BLACK)+"/xx"+i+"yy"+j+"\" class=\"empty\"/></td>"; break; + case WHITE: html += "<td class=\"white\"/>"; break; + case BLACK: html += "<td class=\"black\"/>"; break; + case WALL: html += "<td class=\"wall\"/>"; break; + } + } + html +="</tr>"; + } + html += "</tbody></table></div>"; + html += "<div class=\""+classPlayerWhite+"\">"+cntWhite+"</div>"; + html += "<div class=\""+classPlayerBlack+"\">"+cntBlack+"</div>"; + html += "</body></html>"; + break; + } + } + return html; + } + + public class ReversiListener implements LocationListener { + public void changed(LocationEvent e) { + } + public void changing(LocationEvent e) { + try { + final Browser browser = (Browser)e.widget; + if (e.location.indexOf(ACTION_START_1_PLAYER) != -1 || e.location.indexOf(ACTION_START_2_PLAYERS) != -1) { + computer = e.location.indexOf(ACTION_START_1_PLAYER) != -1; + game = new byte[8][8]; + if (computer) ttr = new Pawns(); + for (int i = 0; i < 5; i++) game[(int)(Math.random()*game.length)][(int)(Math.random()*game[0].length)] = WALL; + e.display.asyncExec(new Runnable() { + public void run() { + browser.setText(getHtml(TYPE_BOARD)); + }}); + e.doit = false; + return; + } + if (e.location.indexOf(ACTION_THEME) != -1) { + int index = e.location.indexOf(ACTION_THEME) + ACTION_THEME.length() + 1; + CSS_FOLDER = e.location.substring(index, index + 4); + URL_CSS = PLUGIN_PATH+CSS_FOLDER+"/style.css"; + URL_WELCOME = PLUGIN_PATH+CSS_FOLDER+"/welcome.html"; + e.display.asyncExec(new Runnable() { + public void run() { + browser.setUrl(URL_WELCOME); + }}); + e.doit = false; + return; + } + byte player = EMPTY; + if (e.location.indexOf(ACTION_WHITE) != -1) player = WHITE; + else if (e.location.indexOf(ACTION_BLACK) != -1) player = BLACK; + if (player != EMPTY) { + int index = e.location.indexOf("xx") + 2; + int x = Integer.parseInt(e.location.substring(index, index + 1)); + index = e.location.indexOf("yy") + 2; + int y = Integer.parseInt(e.location.substring(index, index + 1)); + boolean hasMore = add(x, y, player); + isWhite = player != WHITE; + browser.setText(getHtml(hasMore ? TYPE_BOARD : TYPE_BOARD_OVER)); + if (computer && hasMore && !isWhite) play(e.display, browser, 5000); + e.doit = false; + } + }catch (Exception e1 ) { + e1.printStackTrace(); + } + } + } + + public static boolean add(int x, int y, byte color) { + game[x][y] = color; + int cnt = Math.min(x, y), n = 0; + int other_color = color == WHITE ? BLACK : WHITE; + for (int d = 1; d <= cnt; d++) { + if (game[x-d][y-d] == other_color) n++; + else if (game[x-d][y-d] != color) break; + else { if (n > 0) for (d = 1; d <= n; d++) game[x-d][y-d] = color; break; } + } + cnt = Math.min(game.length - 1 - x, game[0].length - 1 - y); n = 0; + for (int d = 1; d <= cnt; d++) { + if (game[x+d][y+d] == other_color) n++; + else if (game[x+d][y+d] != color) break; + else { if (n > 0) for (d = 1; d <= n; d++) game[x+d][y+d] = color; break; } + } + cnt = Math.min(game.length - 1 - x, y); n = 0; + for (int d = 1; d <= cnt; d++) { + if (game[x+d][y-d] == other_color) n++; + else if (game[x+d][y-d] != color) break; + else { if (n > 0) for (d = 1; d <= n; d++) game[x+d][y-d] = color; break; } + } + cnt = Math.min(x, game[0].length - 1 - y); n = 0; + for (int d = 1; d <= cnt; d++) { + if (game[x-d][y+d] == other_color) n++; + else if (game[x-d][y+d] != color) break; + else { if (n > 0) for (d = 1; d <= n; d++) game[x-d][y+d] = color; break; } + } + cnt = y; n = 0; + for (int d = 1; d <= cnt; d++) { + if (game[x][y-d] == other_color) n++; + else if (game[x][y-d] != color) break; + else { if (n > 0) for (d = 1; d <= n; d++) game[x][y-d] = color; break; } + } + cnt = game[0].length - 1 - y; n = 0; + for (int d = 1; d <= cnt; d++) { + if (game[x][y+d] == other_color) n++; + else if (game[x][y+d] != color) break; + else { if (n > 0) for (d = 1; d <= n; d++) game[x][y+d] = color; break; } + } + cnt = x; n = 0; + for (int d = 1; d <= cnt; d++) { + if (game[x-d][y] == other_color) n++; + else if (game[x-d][y] != color) break; + else { if (n > 0) for (d = 1; d <= n; d++) game[x-d][y] = color; break; } + } + cnt = game.length - 1 - x; n = 0; + for (int d = 1; d <= cnt; d++) { + if (game[x+d][y] == other_color) n++; + else if (game[x+d][y] != color) break; + else { if (n > 0) for (d = 1; d <= n; d++) game[x+d][y] = color; break; } + } + + boolean hasMore = false; + cntWhite = 0; cntBlack = 0; + for (int i = 0; i < game.length; i++) + for (int j = 0; j < game[0].length; j++) { + switch (game[i][j]) { + case EMPTY: hasMore = true; break; + case WHITE: cntWhite++; break; + case BLACK: cntBlack++; break; + } + } + return hasMore; + } + + public static void play(final Display display, final Browser browser, int delay) { + ttr.playRequest(game, BLACK); + display.timerExec(3000, new Runnable() { + public void run() { + ttr.getBestMove(move); + boolean hasMore = add(move[0], move[1], BLACK); + isWhite = true; + browser.setText(getHtml(hasMore ? TYPE_BOARD : TYPE_BOARD_OVER)); + } + }); + } +}
\ No newline at end of file |