summaryrefslogtreecommitdiffstats
path: root/examples/org.eclipse.swt.examples.browser.demos
diff options
context:
space:
mode:
authorChristophe Cornu <ccornu>2004-08-18 20:33:58 +0000
committerChristophe Cornu <ccornu>2004-08-18 20:33:58 +0000
commit98d8fd2e9c42dd4e7491f4e699860e214636f2a2 (patch)
tree8576827529e087047a79cfbdef55729028743813 /examples/org.eclipse.swt.examples.browser.demos
parentd361500b3959086a03112578e3a3cafd55b674c1 (diff)
downloadeclipse.platform.swt-98d8fd2e9c42dd4e7491f4e699860e214636f2a2.tar.gz
eclipse.platform.swt-98d8fd2e9c42dd4e7491f4e699860e214636f2a2.tar.xz
eclipse.platform.swt-98d8fd2e9c42dd4e7491f4e699860e214636f2a2.zip
SWT Browser demo example
Diffstat (limited to 'examples/org.eclipse.swt.examples.browser.demos')
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/.classpath7
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/.project28
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/about.html30
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/build.properties7
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/back1.jpgbin0 -> 28021 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/back2.jpgbin0 -> 28352 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/black.gifbin0 -> 1066 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/board1.jpgbin0 -> 17747 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/empty.gifbin0 -> 848 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/line1.gifbin0 -> 233 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/style.css29
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/wall.gifbin0 -> 1066 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/welcome.html32
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css1/white.gifbin0 -> 910 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css2/back2.pngbin0 -> 184490 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css2/black.pngbin0 -> 492 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css2/empty.pngbin0 -> 959 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css2/line1.gifbin0 -> 233 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css2/style.css29
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css2/wall.pngbin0 -> 512 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css2/welcome.html32
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/css2/white.pngbin0 -> 959 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/icons/sample.gifbin0 -> 983 bytes
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/plugin.xml49
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/BrowserDemoPlugin.java49
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/Pawns.java222
-rw-r--r--examples/org.eclipse.swt.examples.browser.demos/src/org/eclipse/swt/examples/browser/demos/views/BrowserDemoView.java233
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 (&quot;Content&quot;). Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+Common Public License Version 1.0 (&quot;CPL&quot;). 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, &quot;Program&quot; 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 (&quot;Other License&quot;), any modifications, enhancements and/or
+other code and/or documentation (&quot;Modifications&quot;) 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
new file mode 100644
index 0000000000..bab9f33410
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css1/back1.jpg
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/back2.jpg b/examples/org.eclipse.swt.examples.browser.demos/css1/back2.jpg
new file mode 100644
index 0000000000..83f68de754
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css1/back2.jpg
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/black.gif b/examples/org.eclipse.swt.examples.browser.demos/css1/black.gif
new file mode 100644
index 0000000000..976c1e9377
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css1/black.gif
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/board1.jpg b/examples/org.eclipse.swt.examples.browser.demos/css1/board1.jpg
new file mode 100644
index 0000000000..0cc4d5e0e8
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css1/board1.jpg
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/empty.gif b/examples/org.eclipse.swt.examples.browser.demos/css1/empty.gif
new file mode 100644
index 0000000000..a6bce4dac9
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css1/empty.gif
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css1/line1.gif b/examples/org.eclipse.swt.examples.browser.demos/css1/line1.gif
new file mode 100644
index 0000000000..f9a0f34ecf
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css1/line1.gif
Binary files differ
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
new file mode 100644
index 0000000000..fb97fc10e8
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css1/wall.gif
Binary files differ
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
new file mode 100644
index 0000000000..c43fd96602
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css1/white.gif
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/back2.png b/examples/org.eclipse.swt.examples.browser.demos/css2/back2.png
new file mode 100644
index 0000000000..6c49d9ffdd
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css2/back2.png
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/black.png b/examples/org.eclipse.swt.examples.browser.demos/css2/black.png
new file mode 100644
index 0000000000..ad466cf198
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css2/black.png
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/empty.png b/examples/org.eclipse.swt.examples.browser.demos/css2/empty.png
new file mode 100644
index 0000000000..d6ed8e03c2
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css2/empty.png
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/css2/line1.gif b/examples/org.eclipse.swt.examples.browser.demos/css2/line1.gif
new file mode 100644
index 0000000000..f9a0f34ecf
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css2/line1.gif
Binary files differ
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
new file mode 100644
index 0000000000..a38a12c7c4
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css2/wall.png
Binary files differ
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
new file mode 100644
index 0000000000..9d28855043
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/css2/white.png
Binary files differ
diff --git a/examples/org.eclipse.swt.examples.browser.demos/icons/sample.gif b/examples/org.eclipse.swt.examples.browser.demos/icons/sample.gif
new file mode 100644
index 0000000000..34fb3c9d8c
--- /dev/null
+++ b/examples/org.eclipse.swt.examples.browser.demos/icons/sample.gif
Binary files differ
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