Author: jbeard
Date: Mon Jun 28 21:16:11 2010
New Revision: 958744

URL: http://svn.apache.org/viewvc?rev=958744&view=rev
Log:
Created a second demo to illustrate the use of statechart API for dynamically 
creating DOM elements with behaviour.

Added:
    
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xhtml
      - copied, changed from r958721, 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop.xhtml
    
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xml
   (with props)

Copied: 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xhtml
 (from r958721, 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop.xhtml)
URL: 
http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xhtml?p2=commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xhtml&p1=commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop.xhtml&r1=958721&r2=958744&rev=958744&view=diff
==============================================================================
--- 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop.xhtml
 (original)
+++ 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xhtml
 Mon Jun 28 21:16:11 2010
@@ -16,16 +16,11 @@
  * limitations under the License.
 -->
 <!--
-This demo illustrates mixing HTML, SVG, and SCXML content in a single compound
-XML document. 
-
-It also illustrates a fairly general technique, which would
-allow authoring of SVG content with inline, declarative behavioural 
descriptions
-using SCXML: 
-* the document is searched for scxml elements 
-* it compiles them locally to JavaScript, and then hooks up event listeners on 
the parent DOM node, 
-       so that DOM events are sent to the state machine for processing
-* the state machine is able to manipulate the DOM directly through executable 
content nodes
+This demo is like drag-and-drop.xhtml demo, except that it illustrates how one
+may create state machines and DOM elements dynamically and procedurally, as
+opposed to declaratively, as was done in the previous example. In this example,
+each dynamically-created element will have its own state machine, hence its
+own state.
 -->
 
 <html xmlns="http://www.w3.org/1999/xhtml"; 
xmlns:svg="http://www.w3.org/2000/svg";>
@@ -42,71 +37,8 @@ using SCXML: 
                <script src="../../lib/js/requirejs/require/xml.js" 
type="text/javascript"></script>
        </head>
        <body>
-               <svg xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; width="100%" height="99%" >
-
-                       <rect width="100" height="100" stroke="black" 
fill="red" id="rectToTranslate" >
-                               <scxml 
-                                       xmlns="http://www.w3.org/2005/07/scxml";
-                                       version="1.0"
-                                       profile="ecmascript"
-                                       id="scxmlRoot"
-                                       initial="initial_default">
-
-                                       <script>
-                                               function 
computeTDelta(oldEvent,newEvent){
-                                                       //summary:computes the 
offset between two events; to be later used with this.translate
-                                                       var dx = 
newEvent.clientX - oldEvent.clientX;
-                                                       var dy = 
newEvent.clientY - oldEvent.clientY;
-
-                                                       return 
{'dx':dx,'dy':dy};
-                                               }
-
-                                               function 
translate(rawNode,tDelta){
-                                                       var tl = 
rawNode.transform.baseVal;
-                                                       var t = 
tl.numberOfItems ? tl.getItem(0) : rawNode.ownerSVGElement.createSVGTransform();
-                                                       var m = t.matrix;
-                                                       var newM = 
rawNode.ownerSVGElement.createSVGMatrix().translate(tDelta.dx,tDelta.dy).multiply(m);
-                                                       t.setMatrix(newM);
-                                                       tl.initialize(t);
-                                                       return newM;
-                                               }
-                                       </script>
-
-                                       <datamodel>
-                                               <data id="firstEvent"/>
-                                               <data id="eventStamp"/>
-                                               <data id="tDelta"/>
-                                               <data id="rawNode"/>
-                                       </datamodel>
-
-                                       <state id="initial_default">
-                                               <transition event="init" 
target="idle">
-                                                       <assign 
location="rawNode" expr="_event.data.rawNode"/>
-                                               </transition>
-                                       </state>
-
-                                       <state id="idle">
-                                               <transition event="mousedown" 
target="dragging">
-                                                       <assign 
location="firstEvent" expr="_event.data"/>
-                                                       <assign 
location="eventStamp" expr="_event.data"/>
-                                               </transition>
-                                       </state>
-
-                                       <state id="dragging">
-                                               <transition event="mouseup" 
target="idle"/>
-
-                                               <transition event="mousemove" 
target="dragging">
-                                                       <assign 
location="tDelta" expr="computeTDelta(eventStamp,_event.data)"/>
-                                                       <script>
-                                                               
translate(rawNode,tDelta);
-                                                       </script>
-                                                       <assign 
location="eventStamp" expr="_event.data"/>
-                                               </transition>
-                                       </state>
-
-                               </scxml>
-                       </rect>
-               </svg>
+               <svg xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; width="100%" height="99%" 
id="canvas"/>
+               <button id="elementButton" 
style="position:absolute;bottom:0px;left:0px;">Make draggable SVG 
Element</button>
                <div id="statusDiv" 
style="position:absolute;bottom:0px;right:0px;"/>
                <script><![CDATA[
                        var resultText;
@@ -115,59 +47,77 @@ using SCXML: 
                                {
                                        "baseUrl":"/"
                                },
-                               ["src/javascript/scxml/cgf/SCXMLCompiler"],
+                               ["src/javascript/scxml/cgf/SCXMLCompiler",
+                                       
"xml!demo/drag-and-drop/drag-and-drop2.xml"],
 
-                               function(compiler){
+                               function(compiler,scxml_input){
+
+                                       var SVG_NS = 
"http://www.w3.org/2000/svg";;
 
                                        var statusDiv = 
document.getElementById("statusDiv");
+                                       var elementButton = 
document.getElementById("elementButton");
+                                       var svgCanvas = 
document.getElementById("canvas");
 
-                                       statusDiv.textContent="Compiling SCXML 
elements...";
+                                       statusDiv.textContent="Compiling 
SCXML...";
 
-                                       //pull SCXML nodes from DOM
-                                       var scxmlElements = 
document.getElementsByTagName("scxml");
-                                       for(var i = 0; i < 
scxmlElements.length; i++){
-                                               var scxml_input = 
scxmlElements[i];
-                                               var domNodeToHookUp = 
scxml_input.parentNode;
-
-                                               //prep scxml document to 
transform by pulling the scxml node into its own document
-                                               var scxmlns = 
"http://www.w3.org/2005/07/scxml";;
-                                               var scxmlToTransform = 
document.implementation.createDocument (scxmlns , "scxml", null);
-                                               var newNode = 
scxmlToTransform.importNode(scxml_input.cloneNode(true),true);
-                                               
scxmlToTransform.replaceChild(newNode,scxmlToTransform.documentElement);
-
-                                               var 
compiledStatechartConstructor, compiledStatechartInstance; 
-
-                                               compiler.compile({
-                                                       
inFiles:[scxmlToTransform],
-                                                       //debug:true,
-                                                       backend:"state",
-                                                       beautify:true,
-                                                       verbose:false,
-                                                       log:false,
-                                                       ie:false
-                                               }, function(scArr){
-                                                       var transformedJs = 
scArr[0];
-
-                                                       //eval
-                                                       
console.log(transformedJs);
-                                                       eval(transformedJs);
-                                                       
compiledStatechartConstructor = StatechartExecutionContext;
-                                                       
compiledStatechartInstance = new compiledStatechartConstructor(); 
-
-                                                       //initialize
-                                                       
compiledStatechartInstance.initialize();
-                                                       
-                                                       //pass in reference to 
rect
-                                                       
compiledStatechartInstance.init({rawNode:domNodeToHookUp}); 
-
-                                                       //hook up DOM events
-                                                       
["mousedown","mouseup","mousemove"].forEach(function(eventName){
-                                                               
domNodeToHookUp.addEventListener(eventName,compiledStatechartInstance[eventName],false);
-                                                       });
-                                               });
-                                       }
+                                       var compiledStatechartConstructor; 
+
+                                       //compile statechart
+                                       compiler.compile({
+                                               inFiles:[scxml_input],
+                                               //debug:true,
+                                               backend:"state",
+                                               beautify:true,
+                                               verbose:false,
+                                               log:false,
+                                               ie:false
+                                       }, function(scArr){
+                                               var transformedJs = scArr[0];
+
+                                               //eval
+                                               console.log(transformedJs);
+                                               eval(transformedJs);
+                                               compiledStatechartConstructor = 
StatechartExecutionContext;
+                                       });
 
                                        statusDiv.textContent+=" Done!";
+
+                                       //just for fun, random color generator, 
courtesy of 
http://stackoverflow.com/questions/1484506/random-color-generator-in-javascript
+                                       function get_random_color() {
+                                               var letters = 
'0123456789ABCDEF'.split('');
+                                               var color = '#';
+                                               for (var i = 0; i < 6; i++ ) {
+                                                       color += 
letters[Math.round(Math.random() * 15)];
+                                               }
+                                               return color;
+                                       }
+
+                                       //hook up button UI control
+                                       
elementButton.addEventListener("click",function(e){
+
+                                               //do DOM stuff- create new blue 
circle
+                                               var newNode = 
document.createElementNS(SVG_NS,"circle"); 
+                                               
newNode.setAttributeNS(null,"cx",50);
+                                               
newNode.setAttributeNS(null,"cy",50);
+                                               
newNode.setAttributeNS(null,"r",50);
+                                               
newNode.setAttributeNS(null,"fill",get_random_color());
+                                               
newNode.setAttributeNS(null,"stroke","black");
+
+                                               var compiledStatechartInstance 
= new compiledStatechartConstructor(); 
+
+                                               //initialize
+                                               
compiledStatechartInstance.initialize();
+                                               
+                                               //pass in reference to rect
+                                               
compiledStatechartInstance.init({rawNode:newNode}); 
+
+                                               //hook up DOM events
+                                               
["mousedown","mouseup","mousemove"].forEach(function(eventName){
+                                                       
newNode.addEventListener(eventName,compiledStatechartInstance[eventName],false);
+                                               });
+
+                                               svgCanvas.appendChild(newNode);
+                                       },false);
                                }
                        );
                ]]></script>

Added: 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xml
URL: 
http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xml?rev=958744&view=auto
==============================================================================
--- 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xml
 (added)
+++ 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xml
 Mon Jun 28 21:16:11 2010
@@ -0,0 +1,60 @@
+<scxml 
+       xmlns="http://www.w3.org/2005/07/scxml";
+       version="1.0"
+       profile="ecmascript"
+       id="scxmlRoot"
+       initial="initial_default">
+
+       <script>
+               function computeTDelta(oldEvent,newEvent){
+                       //summary:computes the offset between two events; to be 
later used with this.translate
+                       var dx = newEvent.clientX - oldEvent.clientX;
+                       var dy = newEvent.clientY - oldEvent.clientY;
+
+                       return {'dx':dx,'dy':dy};
+               }
+
+               function translate(rawNode,tDelta){
+                       var tl = rawNode.transform.baseVal;
+                       var t = tl.numberOfItems ? tl.getItem(0) : 
rawNode.ownerSVGElement.createSVGTransform();
+                       var m = t.matrix;
+                       var newM = 
rawNode.ownerSVGElement.createSVGMatrix().translate(tDelta.dx,tDelta.dy).multiply(m);
+                       t.setMatrix(newM);
+                       tl.initialize(t);
+                       return newM;
+               }
+       </script>
+
+       <datamodel>
+               <data id="firstEvent"/>
+               <data id="eventStamp"/>
+               <data id="tDelta"/>
+               <data id="rawNode"/>
+       </datamodel>
+
+       <state id="initial_default">
+               <transition event="init" target="idle">
+                       <assign location="rawNode" expr="_event.data.rawNode"/>
+               </transition>
+       </state>
+
+       <state id="idle">
+               <transition event="mousedown" target="dragging">
+                       <assign location="firstEvent" expr="_event.data"/>
+                       <assign location="eventStamp" expr="_event.data"/>
+               </transition>
+       </state>
+
+       <state id="dragging">
+               <transition event="mouseup" target="idle"/>
+
+               <transition event="mousemove" target="dragging">
+                       <assign location="tDelta" 
expr="computeTDelta(eventStamp,_event.data)"/>
+                       <script>
+                               translate(rawNode,tDelta);
+                       </script>
+                       <assign location="eventStamp" expr="_event.data"/>
+               </transition>
+       </state>
+
+</scxml>

Propchange: 
commons/sandbox/gsoc/2010/scxml-js/branches/SCXML-141-148/demo/drag-and-drop/drag-and-drop2.xml
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to