diff inkscape/firefox/inkscape.js @ 274:96aae15527c8

Port all basic scene editor from pyGtk to the firefox
author wycc
date Thu, 29 Jan 2009 22:30:46 +0800
parents
children 40c0c907c6dd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inkscape/firefox/inkscape.js	Thu Jan 29 22:30:46 2009 +0800
@@ -0,0 +1,382 @@
+var isInProgress=0;
+
+var MAX_DUMP_DEPTH = 10;
+var mbsvg;
+
+      
+
+function dumpObj(obj, name, indent, depth) {
+      if (depth > MAX_DUMP_DEPTH) {
+             return indent + name + ": <Maximum Depth Reached>\n";
+      }
+      if (typeof obj == "object") {
+             var child = null;
+             var output = indent + name + "\n";
+             indent += "\t";
+             for (var item in obj)
+             {
+                   try {
+                          child = obj[item];
+                   } catch (e) {
+                          child = "<Unable to Evaluate>";
+                   }
+                   if (typeof child == "object") {
+                          output += dumpObj(child, item, indent, depth + 1);
+                   } else {
+                          output += indent + item + ": " + child + "\n";
+                   }
+             }
+             return output;
+      } else {
+             return obj;
+      }
+}
+function dumpObjItem(obj, name, indent, depth) {
+      if (depth > MAX_DUMP_DEPTH) {
+             return indent + name + ": <Maximum Depth Reached>\n";
+      }
+      if (typeof obj == "object") {
+             var child = null;
+             var output = indent + name + "\n";
+             indent += "\t";
+             for (var item in obj)
+             {
+                   try {
+                          child = obj[item];
+                   } catch (e) {
+                          child = "<Unable to Evaluate>";
+                   }
+                   if (typeof child == "object") {
+                          output += dumpObjItem(child, item, indent, depth + 1);
+                   } else {
+                          output += indent + item + ":\n";
+                   }
+             }
+             return output;
+      } else {
+             return obj;
+      }
+}
+
+function inkscape_load(file) 
+{
+	var inkscape = document.getElementById('inkscape');
+	inkscape.innerHTML = "<embed src="+file+" width=1000 height=800 />";
+}
+
+function MBSVG(file)
+{
+	var xmlDoc=document.implementation.createDocument("http://madbutterfly.sourceforge.net/DTD/madbutterfly.dtd","",null);
+	xmlDoc.async=false;
+	xmlDoc.load(file);
+	MBSVG_loadFromDoc(this,xmlDoc);
+
+}
+function MBSVGString(xml)
+{
+	var xmlParser = new DOMParser();
+	var xmlDoc = xmlParser.parseFromString( xml, 'text/xml');
+	MBSVG_loadFromDoc(this,xmlDoc);
+}
+
+
+
+function MBSVG_loadFromDoc(self,xmlDoc)
+{
+	var scenesNode = xmlDoc.getElementsByTagNameNS("http://madbutterfly.sourceforge.net/DTD/madbutterfly.dtd","scene");
+	if (scenesNode == null) {
+		alert('This is not a valid scene file');
+	}
+	var len = scenesNode.length;
+	var i,j;
+	var max = 0;
+	var scenes = new Array();
+
+	// Get the length of scenes
+	for(i=0;i<len;i++) {
+		var s = scenesNode[i];
+		var start = s.getAttribute("start");
+		var end = s.getAttribute("end");
+		var ref = s.getAttribute("ref");
+		var ss = new Object();
+
+		if (end == null) end = start
+		if (max <end) max = end;
+		ss.node = s;
+		ss.start = start;
+		ss.end = end;
+		ss.ref = ref;
+		ss.layer = null;
+		scenes.push(ss);
+	}
+	if (max < 20) max = 20;
+	// Collect all layers
+	var nodes = xmlDoc.getElementsByTagNameNS("http://www.w3.org/2000/svg","svg")[0].childNodes;
+	var layers = new Array();
+	len = nodes.length;
+	for(i=0;i<len;i++) {
+		if (nodes[i].localName == 'g') {
+			var subnodes = nodes[i].childNodes;
+			for(j=0;j<subnodes.length;j++) {
+				if (subnodes[j].localName == 'g') {
+					for(var k=0;k<scenes.length;k++) {
+						if (scenes[k].ref == subnodes[j].getAttribute('id')) {
+							scenes[k].layer = nodes[i].getAttribute('id');
+							break;
+						}
+					}
+				}
+			}
+			layers.push(nodes[i]);
+		}
+	}
+	self.layers = layers;
+	self.scenes = scenes;
+	self.maxframe = max;
+}
+
+function renderUI(mbsvg)
+{
+	var layers = mbsvg.layers;
+	var scenes = mbsvg.scenes;
+	var max = mbsvg.maxframe;
+	var cmd = "<table border=1>\n";
+	cmd = cmd + "<tr><td></td>";
+	for(var j=1;j<=max;j++) 
+		cmd = cmd + "<td>"+j+"</td>";
+	
+	for(var i=layers.length-1;i>=0;i--) {
+		var l = layers[i];
+		var id = l.getAttribute('id');
+		var label = l.getAttribute('inkscape:label');
+		cmd = cmd + "<tr><td>"+label+"</td>";
+		for(j=0;j<max;j++) {
+			var empty = 1;
+			var n = j +1;
+			var id_str = id+"#"+n
+			for(var k=0;k<scenes.length;k++) {
+				if (id != scenes[k].layer) continue;
+				if (n == scenes[k].start) {
+					cmd = cmd + "<td><img class='normal' src=start.png id='"+id_str+"' onClick='selectCell(this)' /></td>";
+					empty = 0;
+					break;
+				} else if ((n>scenes[k].start)&&(n <= scenes[k].end)) {
+					cmd = cmd + "<td><img class='normal' src=fill.png id='"+id_str+"' onClick='selectCell(this)' /></td>";
+					empty = 0;
+					break;
+				}
+			}
+			if (empty) {
+				cmd = cmd + "<td><img class='normal' src=empty.png id='"+id_str+"'onClick='selectCell(this)' /></td>";
+			}
+
+		}
+		cmd = cmd + "</tr>\n";
+	}
+	cmd = cmd + "</table>\n";
+	var frame = document.getElementById('frame');
+	frame.innerHTML=cmd;
+}
+
+function selectCell(obj)
+{
+	var id = obj.getAttribute('id');
+	var layer,n;
+	var f = id.split('#');
+	layer=f[0];
+	n = f[1];
+	var img = obj.getAttribute('src');
+	var f = img.split('-');
+
+	if (f[0] == 'active')
+		return;
+	else {
+		obj.setAttribute('src', 'active-'+img);
+	}
+
+	if (last_select != null) {
+		f = last_select.getAttribute('src').split('-');
+		last_select.setAttribute('src', f[1]);
+	}
+	last_select = obj;
+	currentScene = n;
+	currentLayer = layer;
+}
+
+
+function onButtonClick(obj)
+{
+	if (isInProgress != 0) return;
+	var id = obj.getAttribute('id');
+	if (id == 'Jump') {
+		if (currentScene != 0)
+			gotoScene(currentScene);
+	} else if (id == 'InsertKey') {
+		InsertKey(currentScene);
+	} else if (id == 'ExtendScene') {
+		ExtendScene(currentScene);
+	} else if (id == 'DeleteScene') {
+		DeleteScene(currentScene);
+	}
+}
+
+function gotoScene_cb(resObj)
+{
+
+}
+var nextScene;
+var currentScene = 0;
+var currentLayer = '';
+function gotoScene(n)
+{
+	nextScene = n;
+	var soapBody = new SOAPObject("START");
+	var sr = new SOAPRequest("START", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, gotoScene1);
+	isInProgress++;
+}
+function gotoScene1(resp,n)
+{
+	var soapBody = new SOAPObject("SCENE");
+	var v1 = new SOAPObject("v1");
+	v1.val(nextScene);
+	soapBody.appendChild(v1);
+	var sr = new SOAPRequest("SCENE", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, gotoScene2);
+}
+function gotoScene2(resp)
+{
+	var soapBody = new SOAPObject("PUBLISH");
+	var sr = new SOAPRequest("PUBLISH", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, gotoScene3);
+}
+
+function gotoScene3(resp)
+{
+	isInProgress--;
+}
+
+
+
+function InsertKey(n)
+{
+	nextScene = n;
+	var soapBody = new SOAPObject("START");
+	var sr = new SOAPRequest("START", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, InsertKey1);
+	isInProgress++;
+}
+function InsertKey1(resp)
+{
+	var soapBody = new SOAPObject("INSERTKEY");
+	var v1 = new SOAPObject("v1");
+	v1.attr('type','string');
+	v1.val(currentLayer);
+	soapBody.appendChild(v1);
+	var v2 = new SOAPObject("v2");
+	v2.val(nextScene);
+	soapBody.appendChild(v2);
+	var sr = new SOAPRequest("INSERTKEY", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, RefreshDocument);
+}
+function PublishDocument(resp)
+{
+	mbsvg = new MBSVGString(resp.Body[0].GETDOCResponse[0].Result[0].Text);
+	renderUI(mbsvg);
+
+	var soapBody = new SOAPObject("PUBLISH");
+	var sr = new SOAPRequest("PUBLISH", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, OperationDone);
+}
+
+function RefreshDocument(resp)
+{
+	var soapBody = new SOAPObject("GETDOC");
+	var sr = new SOAPRequest("GETDOC", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, PublishDocument);
+}
+
+function OperationDone(res)
+{
+	isInProgress--;
+}
+
+
+function ExtendScene()
+{
+	var soapBody = new SOAPObject("START");
+	var sr = new SOAPRequest("START", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr,ExtendScene1);
+	isInProgress++;
+}
+
+
+function ExtendScene1(resp)
+{
+	var soapBody = new SOAPObject("EXTENDSCENE");
+	var v1 = new SOAPObject("v1");
+	v1.attr('type','string');
+	v1.val(currentLayer);
+	soapBody.appendChild(v1);
+	var v2 = new SOAPObject("v2");
+	v2.val(currentScene);
+	soapBody.appendChild(v2);
+	var sr = new SOAPRequest("EXTENDSCENE", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, RefreshDocument);
+}
+
+
+function DeleteScene()
+{
+	var soapBody = new SOAPObject("START");
+	var sr = new SOAPRequest("START", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr,DeleteScene1);
+	isInProgress++;
+}
+
+function DeleteScene1(resp)
+{
+	var soapBody = new SOAPObject("DELETESCENE");
+	var v1 = new SOAPObject("v1");
+	v1.attr('type','string');
+	v1.val(currentLayer);
+	soapBody.appendChild(v1);
+	var v2 = new SOAPObject("v2");
+	v2.val(currentScene);
+	soapBody.appendChild(v2);
+	var sr = new SOAPRequest("EXTENDSCENE", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr, RefreshDocument);
+
+}
+
+function FetchDocument()
+{
+	var soapBody = new SOAPObject("START");
+	var sr = new SOAPRequest("START", soapBody);
+	SOAPClient.Proxy = "http://localhost:19192/";
+	SOAPClient.SendRequest(sr,RefreshDocument);
+	isInProgress++;
+}
+
+var last_select = null;
+inkscape_load("scene.mbsvg");
+setTimeout("FetchDocument()",4000);
+
+$('a.button').mouseover(function () {
+			if (isInProgress==0)
+				this.style.MozOpacity = 0.1;
+		}).mouseout(function () {
+			this.style.MozOpacity= 1;
+		});	
+