editor: Allow for editing raw source in the source editor if document contains invali...
[fnpeditor.git] / src / editor / modules / documentCanvas / documentCanvas.js
index da7ac81..7e70f7f 100644 (file)
@@ -2,20 +2,38 @@
 
 define([
 'libs/jquery',
 
 define([
 'libs/jquery',
+'libs/underscore',
+'fnpjs/logging/logging',
 './canvas/canvas',
 './canvas/canvas',
-'./commands',
-'libs/text!./template.html'], function($, canvas3, commands, template) {
+'libs/text!./template.html'], function($, _, logging, canvas3, template) {
 
 'use strict';
 
 
 'use strict';
 
+
+var logger = logging.getLogger('documentCanvas');
+
 return function(sandbox) {
 
 return function(sandbox) {
 
-    var canvas = canvas3.fromXMLDocument(null, sandbox.publish);
+    var canvasElements = [];
+
+    sandbox.getPlugins().forEach(function(plugin) {
+        canvasElements = canvasElements.concat(plugin.canvasElements || []);
+    });
+
+    var canvas = canvas3.fromXMLDocument(null, canvasElements, {
+        user: sandbox.getConfig().user
+    });
     var canvasWrapper = $(template);
     var shownAlready = false;
     var scrollbarPosition = 0,
     var canvasWrapper = $(template);
     var shownAlready = false;
     var scrollbarPosition = 0,
+        actionHandlers = {},
         cursorPosition;
         cursorPosition;
+        
     
     
+    canvas.on('selectionChanged', function(selection) {
+        sandbox.publish('selectionChanged', selection);
+    });
+
     canvasWrapper.onShow = function() {
         if(!shownAlready) {
             shownAlready = true;
     canvasWrapper.onShow = function() {
         if(!shownAlready) {
             shownAlready = true;
@@ -33,22 +51,28 @@ return function(sandbox) {
 
     /* public api */
     return {
 
     /* public api */
     return {
-        start: function() { sandbox.publish('ready'); },
+        start: function() {
+            sandbox.getPlugins().forEach(function(plugin) {
+                var handlers;
+                if(plugin.canvas) {
+                    handlers = plugin.canvas.actionHandlers;
+                    if(handlers && !_.isArray(handlers)) {
+                        handlers = [handlers];
+                    }
+                    actionHandlers[plugin.name] = handlers;
+                }
+            });
+            sandbox.publish('ready');
+        },
         getView: function() {
             return canvasWrapper;
         },
         getView: function() {
             return canvasWrapper;
         },
+        getCanvas: function() {
+            return canvas;
+        },
         setDocument: function(wlxmlDocument) {
             canvas.loadWlxmlDocument(wlxmlDocument);
         setDocument: function(wlxmlDocument) {
             canvas.loadWlxmlDocument(wlxmlDocument);
-            canvasWrapper.find('#rng-module-documentCanvas-content').empty().append(canvas.view());
-        },
-        modifyCurrentNodeElement: function(attr, value) {
-            var currentNodeElement = canvas.getCurrentNodeElement();
-            if(attr === 'class' || attr === 'tag') {
-                currentNodeElement['setWlxml'+(attr[0].toUpperCase() + attr.substring(1))](value);
-            } else {
-                currentNodeElement.setWlxmlMetaAttr(attr, value);
-            }
-            sandbox.publish('currentNodeElementChanged', currentNodeElement);
+            canvasWrapper.find('#rng-module-documentCanvas-contentWrapper').empty().append(canvas.view());
         },
         highlightElement: function(node) {
             canvas.toggleElementHighlight(node, true);
         },
         highlightElement: function(node) {
             canvas.toggleElementHighlight(node, true);
@@ -59,9 +83,17 @@ return function(sandbox) {
         jumpToElement: function(node) {
             canvas.setCurrentElement(node);
         },
         jumpToElement: function(node) {
             canvas.setCurrentElement(node);
         },
-        command: function(command, params) {
-            commands.run(command, params, canvas, sandbox.getConfig().user);
-            sandbox.publish('contentChanged');
+        onAfterActionExecuted: function(action, ret) {
+            if(ret && ret.isValid()) {
+                logger.debug('The action returned a valid fragment');
+                return canvas.select(ret);
+            }
+
+            logger.debug('No valid fragment returned from the action');
+
+            (actionHandlers[action.getPluginName()] || []).forEach(function(handler) {
+                handler(canvas, action, ret);
+            });
         }
     };
     
         }
     };