You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2011/02/27 04:53:12 UTC

svn commit: r1074983 - in /tuscany/sca-cpp/trunk: etc/ modules/edit/ modules/edit/htdocs/app/ modules/edit/htdocs/graph/ modules/edit/htdocs/page/ modules/edit/palettes/event/ modules/edit/palettes/events/ modules/edit/palettes/list/ modules/edit/palet...

Author: jsdelfino
Date: Sun Feb 27 03:53:11 2011
New Revision: 1074983

URL: http://svn.apache.org/viewvc?rev=1074983&view=rev
Log:
Refactor component palettes a bit and support autosave.

Added:
    tuscany/sca-cpp/trunk/modules/edit/palettes/event/
    tuscany/sca-cpp/trunk/modules/edit/palettes/event/palette.composite
      - copied, changed from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/events/palette.composite
    tuscany/sca-cpp/trunk/modules/edit/palettes/list/
    tuscany/sca-cpp/trunk/modules/edit/palettes/list/palette.composite
      - copied, changed from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/lists/palette.composite
    tuscany/sca-cpp/trunk/modules/edit/palettes/search/
    tuscany/sca-cpp/trunk/modules/edit/palettes/search/palette.composite
      - copied, changed from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/palette.composite
    tuscany/sca-cpp/trunk/modules/edit/palettes/sensor/
    tuscany/sca-cpp/trunk/modules/edit/palettes/sensor/palette.composite
      - copied, changed from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/palette.composite
    tuscany/sca-cpp/trunk/modules/edit/palettes/talk/
    tuscany/sca-cpp/trunk/modules/edit/palettes/talk/palette.composite
    tuscany/sca-cpp/trunk/modules/edit/palettes/transform/
    tuscany/sca-cpp/trunk/modules/edit/palettes/transform/palette.composite
    tuscany/sca-cpp/trunk/modules/edit/palettes/value/
    tuscany/sca-cpp/trunk/modules/edit/palettes/value/palette.composite
      - copied, changed from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/values/palette.composite
Removed:
    tuscany/sca-cpp/trunk/modules/edit/palettes/events/
    tuscany/sca-cpp/trunk/modules/edit/palettes/lists/
    tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/
    tuscany/sca-cpp/trunk/modules/edit/palettes/values/
Modified:
    tuscany/sca-cpp/trunk/etc/git-exclude
    tuscany/sca-cpp/trunk/modules/edit/Makefile.am
    tuscany/sca-cpp/trunk/modules/edit/htdocs/app/app.html
    tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html
    tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js
    tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.html
    tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.js
    tuscany/sca-cpp/trunk/modules/edit/palettes/social/palette.composite

Modified: tuscany/sca-cpp/trunk/etc/git-exclude
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/etc/git-exclude?rev=1074983&r1=1074982&r2=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/etc/git-exclude (original)
+++ tuscany/sca-cpp/trunk/etc/git-exclude Sun Feb 27 03:53:11 2011
@@ -112,4 +112,6 @@ json-value
 value-json
 element-value
 value-element
+modules/edit/apps/*/htdocs
+modules/edit/apps/*/nuvem
 

Modified: tuscany/sca-cpp/trunk/modules/edit/Makefile.am
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/Makefile.am?rev=1074983&r1=1074982&r2=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/Makefile.am (original)
+++ tuscany/sca-cpp/trunk/modules/edit/Makefile.am Sun Feb 27 03:53:11 2011
@@ -17,6 +17,6 @@
 
 
 moddir = $(prefix)/modules/edit
-nobase_dist_mod_DATA = htdocs/*.html htdocs/dash/*.html htdocs/app/*.html htdocs/graph/*.html htdocs/graph/*.js htdocs/page/*.html htdocs/page/*.js htdocs/login/*.html htdocs/logout/*.html
-EXTRA_DIST = htdocs/*.html htdocs/dash/*.html htdocs/app/*.html htdocs/graph/*.html htdocs/graph/*.js htdocs/page/*.html htdocs/page/*.js htdocs/login/*.html htdocs/logout/*.html
+nobase_dist_mod_DATA = htdocs/*.html htdocs/dash/*.html htdocs/app/*.html htdocs/graph/*.html htdocs/graph/*.js htdocs/page/*.html htdocs/page/*.js htdocs/login/*.html htdocs/logout/*.html palettes/*/palette.composite apps/*/app.composite apps/*/app.html
+EXTRA_DIST = htdocs/*.html htdocs/dash/*.html htdocs/app/*.html htdocs/graph/*.html htdocs/graph/*.js htdocs/page/*.html htdocs/page/*.js htdocs/login/*.html htdocs/logout/*.html palettes/*/palette.composite apps/*/app.composite apps/*/app.html
 

Modified: tuscany/sca-cpp/trunk/modules/edit/htdocs/app/app.html
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/htdocs/app/app.html?rev=1074983&r1=1074982&r2=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/htdocs/app/app.html (original)
+++ tuscany/sca-cpp/trunk/modules/edit/htdocs/app/app.html Sun Feb 27 03:53:11 2011
@@ -37,7 +37,7 @@
 
 <th class="thl thr" style="padding-top: 0px; padding-bottom: 0px; padding-right: 0px; text-align: right;">
 <span id="source" style="font-weight: normal;">[atom]</span>
-<input type="button" id="saveButton" style="font-weight: bold;" Value="Save"/>
+<input type="button" id="saveButton" style="font-weight: bold;" Value="Saved"/>
 </th>
 </tr>
 </table>
@@ -74,6 +74,12 @@ var appname = ui.queryParams()['app'];
 $('source').innerHTML = '[<a href="/apps/' + appname + '">atom</a>]';
 
 /**
+ * The current app entry and corresponding saved XML content.
+ */
+var appentry;
+var savedappentryxml = '';
+
+/**
  * Default field values.
  */
 var deftitle = 'Enter the title of your app here';
@@ -86,25 +92,61 @@ var defdesc = 'Enter a short description
  */
 function getapp(name) {
     dashboard.get(name, function(doc) {
-        var entry = doc != null? atom.readATOMEntryDocument(doc) : mklist('', name);
-        $('appTitle').value = car(entry) != ''? car(entry) : deftitle;
+        appentry = doc != null? atom.readATOMEntryDocument(doc) : mklist('', name);
+        $('appTitle').value = car(appentry) != ''? car(appentry) : deftitle;
         $('appCategory').value = defcategory;
         $('appUpdated').innerHTML = defdate;
         $('appDescription').innerHTML = defdesc;
+        savedappentryxml = car(atom.writeATOMEntry(appentry));
     });
 }
 
 /**
- * Save an app.
+ * Handle save button click event.
  */
 $('saveButton').onclick = function() {
-    var title = $('appTitle').value;
-    var app = mklist(title != deftitle && title != ''? title : appname, appname, mklist());
-    var entry = atom.writeATOMEntry(app);
-    dashboard.put(appname, car(entry));
-    return false;
+    return save();
 };
 
+/**
+ * Save the current app.
+ */
+function save() {
+    $('saveButton').value = 'Saving';
+    var title = $('appTitle').value;
+    appentry = mklist(title != deftitle && title != ''? title : appname, appname, mklist());
+    savedappentryxml = car(atom.writeATOMEntry(appentry));
+    dashboard.put(appname, savedappentryxml, function() {
+        if (savedappentryxml == car(atom.writeATOMEntry(appentry)))
+            $('saveButton').value = 'Saved';
+        return true;
+    });
+    return true;
+}
+
+/**
+ * Handle a change event
+ */
+function onappchange() {
+    var title = $('appTitle').value;
+    appentry = mklist(title != deftitle && title != ''? title : appname, appname, mklist());
+    if (savedappentryxml == car(atom.writeATOMEntry(appentry)))
+        return false;
+    $('saveButton').value = 'Save now';
+
+    // Autosave after 3 seconds
+    setTimeout(function() {
+        if (savedappentryxml == car(atom.writeATOMEntry(appentry)))
+            return false;
+        return save();
+    }, 3000);
+    return true;
+}
+
+$('appTitle').onchange = onappchange;
+$('appCategory').onchange = onappchange;
+$('appDescription').onchange = onappchange;
+
 // Get the current app
 getapp(appname);
 

Modified: tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html?rev=1074983&r1=1074982&r2=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html (original)
+++ tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.html Sun Feb 27 03:53:11 2011
@@ -44,7 +44,7 @@
 
 <th class="thl thr" style="padding-top: 0px; padding-bottom: 0px; padding-right: 0px; text-align: right;">
 <span id="source" style="font-weight: normal;">[atom json]</span>
-<input type="button" id="saveButton" style="font-weight: bold;" Value="Save"/>
+<input type="button" id="saveButton" style="font-weight: bold;" Value="Saved"/>
 </th>
 </tr>
 
@@ -70,8 +70,9 @@ var appname = ui.queryParams()['app'];
 $('source').innerHTML = '[<a href="/apps/' + appname + '">atom</a> <a href="/appcache/' + appname + '/app.composite">json</a>]';
 
 /**
- * The current app composite.
+ * The current app composite and corresponding saved XML content.
  */
+var savedcomposxml = '';
 var composite;
 
 /**
@@ -100,7 +101,10 @@ function getapp(name, g) {
                 '</composite>';
             composite = readXML(mklist(x));
         }
-        graph.edit(name, composite, graph.composite(composite, graph.mkpath().move(palcx,0)), g);
+        graph.edit(name, composite, graph.composite(composite, graph.mkpath().move(palcx,0)), oncomposchange, g);
+
+        // Track the saved composite XML
+        savedcomposxml = car(writeXML(composite, false));
     });
 }
 
@@ -134,18 +138,45 @@ function installpalette(name, pos, g, bg
 }
 
 /**
- * Save the current edited page.
+ * Handle save button click event.
  */
 $('saveButton').onclick = function(e) {
+    return save();
+};
 
-    // Update the page ATOM entry
-    var compxml = writeXML(composite, false);
+/**
+ * Save the current composite.
+ */
+function save() {
+    $('saveButton').value = 'Saving';
+    savedcomposxml = car(writeXML(composite, false));
     var entry = '<entry xmlns="http://www.w3.org/2005/Atom">' +
         '<title type="text">' + appname + '</title><id>' + appname + '</id><content type="application/xml"><item>' +
-        compxml + '</item></content></entry>';
+        savedcomposxml + '</item></content></entry>';
     apps.put(appname, entry, function() {
+        if (savedcomposxml == car(writeXML(composite, false)))
+            $('saveButton').value = 'Saved';
+        return true;
     });
-};
+    return true;
+}
+
+/**
+ * Handle a composite change event
+ */
+function oncomposchange() {
+    if (savedcomposxml == car(writeXML(composite, false)))
+        return false;
+    $('saveButton').value = 'Save now';
+
+    // Autosave after 3 seconds
+    setTimeout(function() {
+        if (savedcomposxml == car(writeXML(composite, false)))
+            return false;
+        return save();
+    }, 3000);
+    return true;
+}
 
 // Create editor graph area
 var g = graph.mkgraph(graph.mkpath().move(0,40), $('compName'), $('propValue'), $('compValue'));
@@ -153,17 +184,20 @@ var bg = graph.mkgroup(graph.mkpath());
 
 // Install the palettes
 var gpalettes = new Array();
-var spalette = 'events';
+var spalette = 'event';
 var pos = graph.mkpath();
-installpalette('events', pos.rmove(0,0), g, bg, spalette, gpalettes);
-installpalette('values', pos.rmove(0,40), g, bg, spalette, gpalettes);
+installpalette('event', pos.rmove(0,0), g, bg, spalette, gpalettes);
+installpalette('value', pos.rmove(0,40), g, bg, spalette, gpalettes);
 installpalette('url', pos.rmove(0, 40), g, bg, spalette, gpalettes);
-installpalette('lists', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('list', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('transform', pos.rmove(0, 40), g, bg, spalette, gpalettes);
 installpalette('text', pos.rmove(0, 40), g, bg, spalette, gpalettes);
 installpalette('logic', pos.rmove(0, 40), g, bg, spalette, gpalettes);
 installpalette('math', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('talk', pos.rmove(0, 40), g, bg, spalette, gpalettes);
 installpalette('social', pos.rmove(0, 40), g, bg, spalette, gpalettes);
-installpalette('sensors', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('search', pos.rmove(0, 40), g, bg, spalette, gpalettes);
+installpalette('sensor', pos.rmove(0, 40), g, bg, spalette, gpalettes);
 
 // Get and display the current app
 getapp(appname, g);

Modified: tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js?rev=1074983&r1=1074982&r2=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js (original)
+++ tuscany/sca-cpp/trunk/modules/edit/htdocs/graph/graph.js Sun Feb 27 03:53:11 2011
@@ -58,7 +58,7 @@ var proxcy = 20;
 var buttoncx = 70;
 var buttoncy = 30;
 var curvsz = 6;
-var tabsz = 3;
+var tabsz = 2;
 
 /**
  * Base path class.
@@ -236,6 +236,9 @@ if (ui.isIE()) {
                     pvalue.value = '';
                     cvalue.innerHTML = '';
                 }
+
+                // Trigger composite change event
+                vmlg.oncomposchange();
             }
 
             // Forget current dragged component
@@ -281,14 +284,17 @@ if (ui.isIE()) {
                 return false;
 
             // Change component name and refactor references to it
-            var compos = scdl.composite(svg.compos);
+            var compos = scdl.composite(vmlg.compos);
             cname.value = graph.ucid(cname.value, compos);
             graph.selected.id = cname.value;
-            cvalue.innerHTML = graph.compvaluelink(svg.appname, graph.selected.id);
+            cvalue.innerHTML = graph.compvaluelink(vmlg.appname, graph.selected.id);
             setElement(compos, graph.renamecomp(graph.selected.comp, compos, cname.value));
 
             // Refresh the composite
-            graph.refresh(svg);
+            graph.refresh(vmlg);
+
+            // Trigger composite change event
+            vmlg.oncomposchange();
             return false;
         };
 
@@ -301,7 +307,10 @@ if (ui.isIE()) {
             pvalue.value = graph.property(graph.selected.comp);
 
             // Refresh the composite
-            graph.refresh(svg);
+            graph.refresh(vmlg);
+
+            // Trigger composite change event
+            vmlg.oncomposchange();
             return false;
         };
 
@@ -391,7 +400,7 @@ if (ui.isIE()) {
     graph.comptitlewidth = function(comp) {
         var t = graph.title(comp);
         graph.comptitlewidthdiv.innerHTML = t;
-        var twidth = graph.comptitlewidthdiv.offsetWidth;
+        var twidth = graph.comptitlewidthdiv.offsetWidth + 4;
         graph.comptitlewidthdiv.innerHTML = '';
         return twidth;
     };
@@ -412,7 +421,7 @@ if (ui.isIE()) {
     graph.proptitlewidth = function(comp) {
         var t = graph.property(comp);
         graph.proptitlewidthdiv.innerHTML = t;
-        var twidth = graph.proptitlewidthdiv.offsetWidth;
+        var twidth = graph.proptitlewidthdiv.offsetWidth + 4;
         graph.proptitlewidthdiv.innerHTML = '';
         return twidth;
     };
@@ -714,6 +723,9 @@ if (ui.isIE()) {
 
             // Refresh the composite
             graph.refresh(svg);
+
+            // Trigger composite change event
+            svg.oncomposchange();
             return false;
         };
 
@@ -778,6 +790,9 @@ if (ui.isIE()) {
 
             // Refresh the composite
             graph.refresh(svg);
+
+            // Trigger composite change event
+            svg.oncomposchange();
             return false;
         };
         
@@ -791,6 +806,9 @@ if (ui.isIE()) {
 
             // Refresh the composite
             graph.refresh(svg);
+
+            // Trigger composite change event
+            svg.oncomposchange();
             return false;
         };
 
@@ -868,7 +886,7 @@ if (ui.isIE()) {
     graph.comptitlewidth = function(comp) {
         var title = graph.comptitle(comp);
         graph.titlewidthsvg.appendChild(title);
-        var width = title.getBBox().width;
+        var width = title.getBBox().width + 4;
         graph.titlewidthsvg.removeChild(title);
         return width;
     };
@@ -906,7 +924,7 @@ if (ui.isIE()) {
     graph.proptitlewidth = function(comp) {
         var title = graph.proptitle(comp);
         graph.titlewidthsvg.appendChild(title);
-        var width = title.getBBox().width;
+        var width = title.getBBox().width + 4;
         graph.titlewidthsvg.removeChild(title);
         return width;
     };
@@ -1200,6 +1218,8 @@ graph.compheight = function(comp, cassoc
         var height = Math.max(lsvcsh, rrefsh);
         if (!isNil(graph.brefs(comp)))
             height = Math.max(height, (tabsz * 10) + (tabsz * 4) + (tabsz * 2));
+        if (graph.property(comp) != '')
+            height = Math.max(40, height);
         return height;
     });
 };
@@ -1532,7 +1552,7 @@ graph.composite = function(compos, pos) 
          * Move the rendering cursor down below a component.
          */
         function rendermove(comp, cassoc, pos) {
-            return pos.clone().rmove(0, graph.compclosureheight(comp, cassoc) + (tabsz * 2));
+            return pos.clone().rmove(0, graph.compclosureheight(comp, cassoc) + Math.max((tabsz * 2), 8));
         }
 
         if (isNil(svcs))
@@ -1803,11 +1823,12 @@ graph.refresh = function(g) {
  * Display and enable editing of a composite and the graphical
  * nodes that represent it.
  */
-graph.edit = function(appname, compos, nodes, g) {
+graph.edit = function(appname, compos, nodes, onchange, g) {
 
     // Store the appname and composite in the graphical canvas
     g.appname = appname;
     g.compos = compos;
+    g.oncomposchange = onchange;
 
     // Display the composite nodes
     return graph.display(nodes, g);

Modified: tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.html
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.html?rev=1074983&r1=1074982&r2=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.html (original)
+++ tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.html Sun Feb 27 03:53:11 2011
@@ -43,7 +43,7 @@
 
 <th class="thl thr" style="padding-top: 0px; padding-bottom: 0px; padding-right: 0px; text-align: right;">
 <span id="source" style="font-weight: normal;">[atom json]</span>
-<input type="button" id="saveButton" style="font-weight: bold;" Value="Save"/>
+<input type="button" id="saveButton" style="font-weight: bold;" Value="Saved"/>
 </th>
 </tr>
 
@@ -57,7 +57,7 @@
 <span class="button" id="palette:button" style="position: absolute; left: 0px; top: 80px;"><input type="button" value="button"/></span>
 <span class="entry" id="palette:entry" style="position: absolute; left: 0px; top: 120px;"><input type="text" value="field" size="5"/></span>
 <span class="password" id="palette:password" style="position: absolute; left: 0px; top: 160px;"><input type="password" value="password" size="5"/></span>
-<span class="checkbox" id="palette:checkbox" style="position: absolute; left: 0px; top: 200px;"><input type="checkbox" value="checkbox"></input><span>checkbox</span></span>
+<span class="checkbox" id="palette:checkbox" style="position: absolute; left: 0px; top: 200px;"><input type="checkbox" value="checkbox"/><span>checkbox</span></span>
 <span class="list" id="palette:list" style="position: absolute; left: 0px; top: 240px;"><select><option value="list">list</option></select></span>
 <span class="link" id="palette:link" style="position: absolute; left: 0px; top: 280px;"><a href="/"><span>link</span></a></span>
 <span class="text" id="palette:text" style="position: absolute; left: 0px; top: 320px;"><span>text</span></span>
@@ -92,6 +92,11 @@ function atompage(doc) {
 }
 
 /**
+ * Track the current page saved XHTML content.
+ */
+var savedpagexhtml = '';
+
+/**
  * Get and display an app page.
  */
 function getpage(name, edit) {
@@ -105,10 +110,9 @@ function getpage(name, edit) {
         if (isNil(el)) {
 
             // Create a default empty page if necessary
-            buffer.innerHTML = '<div id="page"></div>';
+            buffer.innerHTML = '<DIV id="page">\n</DIV>\n';
         } else {
-            var xhtml = writeStrings(writeXML(atompage(doc), false));
-            buffer.innerHTML = xhtml;
+            buffer.innerHTML = writeStrings(writeXML(atompage(doc), false));
         }
 
         // Append page nodes to editor
@@ -117,18 +121,27 @@ function getpage(name, edit) {
                 edit.appendChild(e);
                 return page.cover(e);
             }, nodeList(buffer.childNodes[0].childNodes));
+
+        savedpagexhtml = pagexhtml();
     });
 }
 
 /**
- * Save the current edited page.
+ * Handle save button click event.
  */
 $('saveButton').onclick = function(e) {
+    return save();
+};
+
+/**
+ * Return the current page XHTML content.
+ */
+function pagexhtml() {
 
     // Copy page DOM to hidden buffer
     var edit = $('page');
     var buffer = $('buffer');
-    buffer.innerHTML = '<div id="page"></div>'
+    buffer.innerHTML = '<DIV id="page">\n</DIV>\n'
     var div = buffer.childNodes[0];
     div.innerHTML = edit.innerHTML;
 
@@ -153,17 +166,51 @@ $('saveButton').onclick = function(e) {
     var lxhtml = readXHTMLElement(div);
     var xhtml = writeStrings(writeXML(lxhtml, false));
 
+    return xhtml;
+}
+
+/**
+ * Save the current page.
+ */
+function save() {
+    $('saveButton').value = 'Saving';
+
+    // Get the current page XHTML content
+    savedpagexhtml = pagexhtml();
+
     // Update the page ATOM entry
     var entry = '<entry xmlns="http://www.w3.org/2005/Atom">' +
         '<title type="text">' + appname + '</title><id>' + appname + '</id><content type="application/xml"><item>' +
-        xhtml + '</item></content></entry>';
+        savedpagexhtml + '</item></content></entry>';
 
-    pages.put(appname, entry, function(e) {});
+    pages.put(appname, entry, function(e) {
+        if (savedpagexhtml == pagexhtml())
+            $('saveButton').value = 'Saved';
+        return true;
+    });
+    return true;
 };
 
+/**
+ * Handle a page change event
+ */
+function onpagechange() {
+    if (savedpagexhtml == pagexhtml())
+        return false;
+    $('saveButton').value = 'Save now';
+
+    // Autosave after 3 seconds
+    setTimeout(function() {
+        if (savedpagexhtml == pagexhtml())
+            return false;
+        return save();
+    }, 3000);
+    return true;
+}
+
 // Initialize the page editor
 var edit = $('page');
-page.edit(edit, $('widgetName'), $('widgetText'));
+page.edit(edit, $('widgetName'), $('widgetText'), onpagechange);
 
 // Get and display the current app page
 getpage(appname, edit);

Modified: tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.js
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.js?rev=1074983&r1=1074982&r2=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.js (original)
+++ tuscany/sca-cpp/trunk/modules/edit/htdocs/page/page.js Sun Feb 27 03:53:11 2011
@@ -33,12 +33,15 @@ if (ui.isIE()) {
     /**
      * Init a page editor. IE-specific implementation.
      */
-    page.edit = function(elem, wname, wtext) {
+    page.edit = function(elem, wname, wtext, onchange) {
 
         // Track element dragging and selection
         page.dragging = null;
         page.selected = null;
 
+        // Trigger page change events
+        page.onpagechange = onchange;
+
         /**
          * Handle a mouse down event.
          */
@@ -103,6 +106,9 @@ if (ui.isIE()) {
             // Forget current dragged element
             page.dragging = null;
             elem.releaseCapture();
+            
+            // Trigger page change event
+            page.onpagechange();
             return false;
         };
 
@@ -142,6 +148,9 @@ if (ui.isIE()) {
             if (page.selected == null)
                 return false;
             page.selected.id = wname.value;
+
+            // Trigger page change event
+            page.onpagechange();
             return false;
         };
 
@@ -149,6 +158,9 @@ if (ui.isIE()) {
             if (page.selected == null)
                 return false;
             page.settext(page.selected, wtext.value);
+
+            // Trigger page change event
+            page.onpagechange();
             return false;
         };
 
@@ -164,12 +176,15 @@ if (ui.isIE()) {
     /**
      * Init a page editor. Generic implementation for all other browsers.
      */
-    page.edit = function(elem, wname, wtext) {
+    page.edit = function(elem, wname, wtext, onchange) {
 
         // Track element dragging and selection
         page.dragging = null;
         page.selected = null;
 
+        // Trigger page change events
+        page.onpagechange = onchange;
+
         /**
          * Handle a mouse down event.
          */
@@ -239,6 +254,9 @@ if (ui.isIE()) {
 
             // Forget dragged element
             page.dragging = null;
+
+            // Trigger page change event
+            page.onpagechange();
             return false;
         };
 
@@ -289,6 +307,9 @@ if (ui.isIE()) {
             if (page.selected == null)
                 return false;
             page.selected.id = wname.value;
+
+            // Trigger page change event
+            page.onpagechange();
             return false;
         };
 
@@ -296,6 +317,9 @@ if (ui.isIE()) {
             if (page.selected == null)
                 return false;
             page.settext(page.selected, wtext.value);
+
+            // Trigger page change event
+            page.onpagechange();
             return false;
         };
 

Copied: tuscany/sca-cpp/trunk/modules/edit/palettes/event/palette.composite (from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/events/palette.composite)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/palettes/event/palette.composite?p2=tuscany/sca-cpp/trunk/modules/edit/palettes/event/palette.composite&p1=tuscany/sca-cpp/trunk/modules/edit/palettes/events/palette.composite&r1=1074926&r2=1074983&rev=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/palettes/events/palette.composite (original)
+++ tuscany/sca-cpp/trunk/modules/edit/palettes/event/palette.composite Sun Feb 27 03:53:11 2011
@@ -19,7 +19,7 @@
 -->
 <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
   xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
-  targetNamespace="http://events"
+  targetNamespace="http://event"
   name="palette">
         
     <service name="page" promote="page"/>

Copied: tuscany/sca-cpp/trunk/modules/edit/palettes/list/palette.composite (from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/lists/palette.composite)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/palettes/list/palette.composite?p2=tuscany/sca-cpp/trunk/modules/edit/palettes/list/palette.composite&p1=tuscany/sca-cpp/trunk/modules/edit/palettes/lists/palette.composite&r1=1074926&r2=1074983&rev=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/palettes/lists/palette.composite (original)
+++ tuscany/sca-cpp/trunk/modules/edit/palettes/list/palette.composite Sun Feb 27 03:53:11 2011
@@ -19,7 +19,7 @@
 -->
 <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
   xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
-  targetNamespace="http://lists"
+  targetNamespace="http://list"
   name="palette">
         
     <service name="list" promote="list"/>
@@ -28,12 +28,8 @@
     <service name="empty" promote="empty"/>
     <service name="itemnb" promote="itemnb"/>
     <service name="find" promote="find"/>
-    <service name="foreach" promote="foreach"/>
-    <service name="filter" promote="filter"/>
-    <service name="reduce" promote="reduce"/>
     <service name="range" promote="range"/>
     <service name="append" promote="append"/>
-    <service name="reverse" promote="reverse"/>
 
     <component name="list" t:title="make list" t:color="yellow1">
         <t:implementation.python script="nuvem/list_.py"/>
@@ -73,31 +69,6 @@
         <reference name="assoc"/>
     </component>
     
-    <component name="foreach" t:title="foreach" t:color="yellow1">
-        <t:implementation.python script="nuvem/map_.py"/>
-        <service name="foreach"/>
-        <reference name="item"/>
-        <reference name="transform"/>
-        <reference name="list"/>
-    </component>
-    
-    <component name="filter" t:title="filter" t:color="yellow1">
-        <t:implementation.python script="nuvem/filter_.py"/>
-        <service name="filter"/>
-        <reference name="item"/>
-        <reference name="condition"/>
-        <reference name="list"/>
-    </component>
-    
-    <component name="reduce" t:title="reduce" t:color="yellow1">
-        <t:implementation.python script="nuvem/reduce_.py"/>
-        <service name="reduce"/>
-        <reference name="item"/>
-        <reference name="accum"/>
-        <reference name="transform"/>
-        <reference name="list"/>
-    </component>
-    
     <component name="range" t:title="range" t:color="yellow1">
         <t:implementation.python script="nuvem/range_.py"/>
         <service name="range"/>
@@ -112,10 +83,4 @@
         <reference name="second"/>
     </component>
     
-    <component name="reverse" t:title="reverse" t:color="yellow1">
-        <t:implementation.python script="nuvem/reverse.py"/>
-        <service name="reverse"/>
-        <reference name="list"/>
-    </component>
-    
 </composite>

Copied: tuscany/sca-cpp/trunk/modules/edit/palettes/search/palette.composite (from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/palette.composite)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/palettes/search/palette.composite?p2=tuscany/sca-cpp/trunk/modules/edit/palettes/search/palette.composite&p1=tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/palette.composite&r1=1074926&r2=1074983&rev=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/palette.composite (original)
+++ tuscany/sca-cpp/trunk/modules/edit/palettes/search/palette.composite Sun Feb 27 03:53:11 2011
@@ -19,23 +19,29 @@
 -->
 <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
   xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
-  targetNamespace="http://sensors"
+  targetNamespace="http://sensor"
   name="palette">
         
-    <service name="location" promote="location"/>
-    <service name="distance" promote="distance"/>
+    <service name="googlesearch" promote="googlesearch"/>
+    <service name="yahoosearch" promote="yahoosearch"/>
+    <service name="bingsearch" promote="bingsearch"/>
 
-    <component name="location" t:title="location" t:color="red1">
-        <t:implementation.python script="location.py"/>
-        <service name="location"/>
-        <reference name="user"/>
+    <component name="googlesearch" t:title="google search" t:color="red1">
+        <t:implementation.python script="nuvem/googlesearch.py"/>
+        <service name="googlesearch"/>
+        <reference name="query"/>
     </component>
     
-    <component name="distance" t:title="distance" t:color="red1">
-        <t:implementation.python script="distance.py"/>
-        <service name="distance"/>
-        <reference name="location1"/>
-        <reference name="location2"/>
+    <component name="yahoosearch" t:title="yahoo search" t:color="red1">
+        <t:implementation.python script="nuvem/yahoosearch.py"/>
+        <service name="yahoosearch"/>
+        <reference name="query"/>
+    </component>
+    
+    <component name="bingsearch" t:title="bing search" t:color="red1">
+        <t:implementation.python script="nuvem/bingsearch.py"/>
+        <service name="bingsearch"/>
+        <reference name="query"/>
     </component>
     
 </composite>

Copied: tuscany/sca-cpp/trunk/modules/edit/palettes/sensor/palette.composite (from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/palette.composite)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/palettes/sensor/palette.composite?p2=tuscany/sca-cpp/trunk/modules/edit/palettes/sensor/palette.composite&p1=tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/palette.composite&r1=1074926&r2=1074983&rev=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/palettes/sensors/palette.composite (original)
+++ tuscany/sca-cpp/trunk/modules/edit/palettes/sensor/palette.composite Sun Feb 27 03:53:11 2011
@@ -19,23 +19,44 @@
 -->
 <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
   xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
-  targetNamespace="http://sensors"
+  targetNamespace="http://sensor"
   name="palette">
         
     <service name="location" promote="location"/>
     <service name="distance" promote="distance"/>
+    <service name="geomap" promote="geomap"/>
+    <service name="weather" promote="weather"/>
+    <service name="traffic" promote="traffic"/>
 
     <component name="location" t:title="location" t:color="red1">
-        <t:implementation.python script="location.py"/>
+        <t:implementation.python script="nuvem/location.py"/>
         <service name="location"/>
         <reference name="user"/>
     </component>
     
     <component name="distance" t:title="distance" t:color="red1">
-        <t:implementation.python script="distance.py"/>
+        <t:implementation.python script="nuvem/distance.py"/>
         <service name="distance"/>
         <reference name="location1"/>
         <reference name="location2"/>
     </component>
     
+    <component name="geomap" t:title="map" t:color="red1">
+        <t:implementation.python script="nuvem/geomap.py"/>
+        <service name="geomap"/>
+        <reference name="location"/>
+    </component>
+    
+    <component name="weather" t:title="weather" t:color="red1">
+        <t:implementation.python script="nuvem/weather.py"/>
+        <service name="weather"/>
+        <reference name="location"/>
+    </component>
+    
+    <component name="traffic" t:title="traffic" t:color="red1">
+        <t:implementation.python script="nuvem/traffic.py"/>
+        <service name="traffic"/>
+        <reference name="location"/>
+    </component>
+    
 </composite>

Modified: tuscany/sca-cpp/trunk/modules/edit/palettes/social/palette.composite
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/palettes/social/palette.composite?rev=1074983&r1=1074982&r2=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/palettes/social/palette.composite (original)
+++ tuscany/sca-cpp/trunk/modules/edit/palettes/social/palette.composite Sun Feb 27 03:53:11 2011
@@ -30,9 +30,6 @@
     <service name="twfriends" promote="twfriends"/>
     <service name="twstatus" promote="twstatus"/>
     <service name="twtimeline" promote="twtimeline"/>
-    <service name="gtalksend" promote="gtalksend"/>
-    <service name="gtalkreceive" promote="gtalkreceive"/>
-    <service name="smssend" promote="smssend"/>
 
     <component name="fbprofile" t:title="facebook profile" t:color="blue1">
         <t:implementation.python script="nuvem/fbprofile.py"/>
@@ -91,26 +88,4 @@
         </reference>
     </component>
     
-    <component name="gtalksend" t:title="send gtalk" t:color="blue1">
-        <t:implementation.python script="nuvem/gtalksend.py"/>
-        <service name="gtalksend"/>
-        <reference name="jid"/>
-        <reference name="to"/>
-        <reference name="msg"/>
-    </component>
-    
-    <component name="gtalkreceive" t:title="when gtalk received" t:color="blue1">
-        <t:implementation.python script="nuvem/gtalkreceive.py"/>
-        <service name="gtalkreceive"/>
-        <reference name="jid"/>
-    </component>
-    
-    <component name="smssend" t:title="send sms" t:color="blue1">
-        <t:implementation.python script="nuvem/smssend.py"/>
-        <service name="smssend"/>
-        <reference name="user"/>
-        <reference name="to"/>
-        <reference name="msg"/>
-    </component>
-    
 </composite>

Added: tuscany/sca-cpp/trunk/modules/edit/palettes/talk/palette.composite
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/palettes/talk/palette.composite?rev=1074983&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/palettes/talk/palette.composite (added)
+++ tuscany/sca-cpp/trunk/modules/edit/palettes/talk/palette.composite Sun Feb 27 03:53:11 2011
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless requiblue by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+  xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
+  targetNamespace="http://talk"
+  name="palette">
+        
+    <service name="call" promote="call"/>
+    <service name="smssend" promote="smssend"/>
+    <service name="gtalksend" promote="gtalksend"/>
+    <service name="gtalkreceive" promote="gtalkreceive"/>
+
+    <component name="call" t:title="place call" t:color="blue1">
+        <t:implementation.python script="nuvem/call.py"/>
+        <service name="call"/>
+        <reference name="to"/>
+    </component>
+    
+    <component name="smssend" t:title="send sms" t:color="blue1">
+        <t:implementation.python script="nuvem/smssend.py"/>
+        <service name="smssend"/>
+        <reference name="user"/>
+        <reference name="to"/>
+        <reference name="msg"/>
+    </component>
+    
+    <component name="gtalksend" t:title="send gtalk" t:color="blue1">
+        <t:implementation.python script="nuvem/gtalksend.py"/>
+        <service name="gtalksend"/>
+        <reference name="jid"/>
+        <reference name="to"/>
+        <reference name="msg"/>
+    </component>
+    
+    <component name="gtalkreceive" t:title="when gtalk received" t:color="blue1">
+        <t:implementation.python script="nuvem/gtalkreceive.py"/>
+        <service name="gtalkreceive"/>
+        <reference name="jid"/>
+    </component>
+    
+</composite>

Added: tuscany/sca-cpp/trunk/modules/edit/palettes/transform/palette.composite
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/palettes/transform/palette.composite?rev=1074983&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/palettes/transform/palette.composite (added)
+++ tuscany/sca-cpp/trunk/modules/edit/palettes/transform/palette.composite Sun Feb 27 03:53:11 2011
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+-->
+<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+  xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
+  targetNamespace="http://transform"
+  name="palette">
+        
+    <service name="foreach" promote="foreach"/>
+    <service name="filter" promote="filter"/>
+    <service name="reduce" promote="reduce"/>
+    <service name="reverse" promote="reverse"/>
+
+    <component name="foreach" t:title="foreach" t:color="yellow1">
+        <t:implementation.python script="nuvem/map_.py"/>
+        <service name="foreach"/>
+        <reference name="item"/>
+        <reference name="transform"/>
+        <reference name="list"/>
+    </component>
+    
+    <component name="filter" t:title="filter" t:color="yellow1">
+        <t:implementation.python script="nuvem/filter_.py"/>
+        <service name="filter"/>
+        <reference name="item"/>
+        <reference name="condition"/>
+        <reference name="list"/>
+    </component>
+    
+    <component name="reduce" t:title="reduce" t:color="yellow1">
+        <t:implementation.python script="nuvem/reduce_.py"/>
+        <service name="reduce"/>
+        <reference name="item"/>
+        <reference name="accum"/>
+        <reference name="transform"/>
+        <reference name="list"/>
+    </component>
+    
+    <component name="reverse" t:title="reverse" t:color="yellow1">
+        <t:implementation.python script="nuvem/reverse.py"/>
+        <service name="reverse"/>
+        <reference name="list"/>
+    </component>
+    
+</composite>

Copied: tuscany/sca-cpp/trunk/modules/edit/palettes/value/palette.composite (from r1074926, tuscany/sca-cpp/trunk/modules/edit/palettes/values/palette.composite)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/edit/palettes/value/palette.composite?p2=tuscany/sca-cpp/trunk/modules/edit/palettes/value/palette.composite&p1=tuscany/sca-cpp/trunk/modules/edit/palettes/values/palette.composite&r1=1074926&r2=1074983&rev=1074983&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/edit/palettes/values/palette.composite (original)
+++ tuscany/sca-cpp/trunk/modules/edit/palettes/value/palette.composite Sun Feb 27 03:53:11 2011
@@ -19,7 +19,7 @@
 -->
 <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
   xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1"
-  targetNamespace="http://values"
+  targetNamespace="http://value"
   name="palette">
         
     <service name="text" promote="text"/>