X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/45bebc5c454ced236db27631004cc2628260f3c9..5d2695bd243591aa1697733184d07cdb3e67cf74:/src/editor/modules/documentCanvas/canvas/container.js diff --git a/src/editor/modules/documentCanvas/canvas/container.js b/src/editor/modules/documentCanvas/canvas/container.js new file mode 100644 index 0000000..6436526 --- /dev/null +++ b/src/editor/modules/documentCanvas/canvas/container.js @@ -0,0 +1,158 @@ +define(function(require) { + +'use strict'; + +var $ = require('libs/jquery'), + _ = require('libs/underscore'), + utils = require('./utils'); + + +var Container = function(nodes, params, element) { + _.extend(this, params); + this.dom = this.dom || $('
'); + this.dom.addClass('canvas-container'); + this.element = element; + + nodes.forEach(function(node) { + var el = this.element.canvas.createElement(node); + if(el.dom) { + this.dom.append(el.dom); + } + }.bind(this)); +}; + +_.extend(Container.prototype, { + remove: function() { + this.element.removeContainer(this); + }, + + onNodeAdded: function(event) { + if(event.meta.node.isRoot()) { + this.element.canvas.reloadRoot();// + return; + } + + var ptr = event.meta.node.prev(), + referenceElement, referenceAction, actionArg; + + while(ptr && !(referenceElement = utils.getElementForElementRootNode(ptr))) { + ptr = ptr.prev(); + } + + if(referenceElement) { + referenceAction = 'after'; + } else { + referenceElement = this; + referenceAction = '_prepend'; + } + + if(event.meta.move) { + /* Let's check if this node had its own canvas element and it's accessible. */ + actionArg = utils.getElementForElementRootNode(event.meta.node); + } + if(!actionArg) { + actionArg = event.meta.node; + } + + referenceElement[referenceAction](actionArg); + }, + onNodeDetached: function(event) { + var container = this; + this.dom.contents().each(function() { + var childElement = container.element.canvas.getDocumentElement(this); + if(childElement && childElement.wlxmlNode.sameNode(event.meta.node)) { + childElement.detach(); + return false; + } + }); + }, + getVerticallyFirstTextElement: function(params) { + var documentElement = require('./documentElement'), + toret; + + params = _.extend({ + considerChildren: true + }, params); + + this.children().some(function(child) { + if(child instanceof documentElement.DocumentTextElement) { + toret = child; + return true; // break + } else if(params.considerChildren) { + toret = child.getVerticallyFirstTextElement(); + if(toret) { + return true; // break + } + } + }); + return toret; + }, + getFirst: function(e1, e2) { + var idx1 = this._childIndex(e1), + idx2 = this._childIndex(e2); + if(e1 === null || e2 === null) { + return undefined; + } + return idx1 <= idx2 ? e1: e2; + }, + + _prepend: function(param) { + var documentElement = require('./documentElement'), + element; + if(param instanceof documentElement.DocumentElement) { + element = param; + } else { + element = this.element.canvas.createElement(param);// + } + if(element.dom) { + this.dom.prepend(element.dom); + } + return element; + }, + _childIndex: function(child) { + var children = this.children(), + toret = null; + children.forEach(function(c, idx) { + if(c.sameNode(child)) { + toret = idx; + return false; + } + }); + return toret; + }, + containsBlock: function() { + var documentElement = require('./documentElement'); + return this.children() + .filter(function(child) { + return child instanceof documentElement.DocumentNodeElement; + }) + .some(function(child) { + if(child.isBlock()) { + return true; + } else { + return child.containsBlock(); + } + }); + }, + children: function() { + var element = this.element.canvas, + toret = []; + this.dom.contents().each(function() { + var childElement = element.getDocumentElement(this); + if(childElement === undefined) { + return true; + } + + toret.push(childElement); + }); + return toret; + }, +}); + +return { + create: function(nodes, params, element) { + return new Container(nodes, params, element); + } +}; + +}); \ No newline at end of file