list fixes: headers, invalid elements, easier ending
[fnpeditor.git] / src / editor / modules / documentCanvas / documentCanvas.js
1 // Module that implements main WYSIWIG edit area
2
3 define([
4 'libs/jquery',
5 'libs/underscore',
6 'fnpjs/logging/logging',
7 './canvas/canvas',
8 'libs/text!./template.html'], function($, _, logging, canvas3, template) {
9
10 'use strict';
11
12
13 var logger = logging.getLogger('documentCanvas');
14
15 return function(sandbox) {
16
17     var canvasElements = [];
18
19     sandbox.getPlugins().forEach(function(plugin) {
20         canvasElements = canvasElements.concat(plugin.canvasElements || []);
21     });
22
23     var canvas = canvas3.fromXMLDocument(null, canvasElements, {
24         user: sandbox.getConfig().user
25     }, sandbox);
26     var canvasWrapper = $(template);
27     var shownAlready = false;
28     var scrollbarPosition = 0,
29         actionHandlers = {},
30         cursorPosition;
31         
32     
33     canvas.on('selectionChanged', function(selection) {
34         sandbox.publish('selectionChanged', selection);
35     });
36
37     canvasWrapper.onShow = function() {
38         if(!shownAlready) {
39             shownAlready = true;
40             canvas.setCurrentElement(canvas.doc().getVerticallyFirstTextElement());
41         } else {
42             canvas.setCursorPosition(cursorPosition);
43             this.find('#rng-module-documentCanvas-contentWrapper').scrollTop(scrollbarPosition);
44         }
45     };
46     
47     canvasWrapper.onHide = function() {
48        scrollbarPosition = this.find('#rng-module-documentCanvas-contentWrapper').scrollTop();
49        cursorPosition = canvas.getCursor().getPosition();
50     };
51
52     /* public api */
53     return {
54         start: function() {
55             sandbox.getPlugins().forEach(function(plugin) {
56                 var handlers;
57                 if(plugin.canvas) {
58                     handlers = plugin.canvas.actionHandlers;
59                     if(handlers && !_.isArray(handlers)) {
60                         handlers = [handlers];
61                     }
62                     actionHandlers[plugin.name] = handlers;
63                 }
64             });
65             sandbox.publish('ready');
66         },
67         getView: function() {
68             return canvasWrapper;
69         },
70         getCanvas: function() {
71             return canvas;
72         },
73         setDocument: function(wlxmlDocument) {
74             canvas.loadWlxmlDocument(wlxmlDocument);
75             canvasWrapper.find('#rng-module-documentCanvas-contentWrapper').empty().append(canvas.view());
76         },
77         onAfterActionExecuted: function(action, ret) {
78             if(ret && ret.isValid && ret.isValid()) {
79                 logger.debug('The action returned a valid fragment');
80                 return canvas.select(ret);
81             }
82
83             logger.debug('No valid fragment returned from the action');
84
85             (actionHandlers[action.getPluginName()] || []).forEach(function(handler) {
86                 handler(canvas, action, ret);
87             });
88         }
89     };
90     
91 };
92
93 });