1 define(function(require) {
5 var $ = require('libs/jquery'),
6 _ = require('libs/underscore'),
7 utils = require('./utils');
10 var Container = function(nodes, params, element) {
11 params = params || {};
12 _.extend(this, params);
13 this.dom = this.dom || $('<div>');
14 this.dom.addClass('canvas-container');
15 this.dom.toggleClass('reset-background', !!params.resetBackground);
16 this.element = element;
18 nodes.forEach(function(node) {
19 var el = this.element.createElement(node, {mirror: this.mirrors});
21 this.dom.append(el.dom);
26 _.extend(Container.prototype, {
28 this.element.removeContainer(this);
31 onNodeAdded: function(event) {
32 if(event.meta.node.isRoot()) {
33 this.element.canvas.reloadRoot();//
37 var ptr = event.meta.node.prev(),
38 referenceElement, referenceAction, actionArg;
40 while(ptr && !(referenceElement = utils.getElementForElementRootNode(ptr, false, this))) {
44 if(referenceElement) {
45 referenceAction = 'after';
47 referenceElement = this;
48 referenceAction = '_prepend';
52 /* Let's check if this node had its own canvas element and it's accessible. */
53 actionArg = utils.getElementForElementRootNode(event.meta.node, false, this);
56 actionArg = event.meta.node;
59 if(referenceAction === 'after') {
60 referenceElement.after(actionArg, {mirror: this.mirrors});
62 referenceElement[referenceAction](actionArg);
65 onNodeDetached: function(event) {
67 this.dom.contents().each(function() {
68 var childElement = container.element.canvas.getDocumentElement(this);
69 if(childElement && childElement.wlxmlNode.sameNode(event.meta.node)) {
70 childElement.detach();
75 getVerticallyFirstTextElement: function(params) {
76 var documentElement = require('./documentElement'),
80 considerChildren: true
83 this.children().some(function(child) {
84 if(child instanceof documentElement.DocumentTextElement) {
87 } else if(params.considerChildren) {
88 toret = child.getVerticallyFirstTextElement();
96 getFirst: function(e1, e2) {
97 var idx1 = this._childIndex(e1),
98 idx2 = this._childIndex(e2);
99 if(e1 === null || e2 === null) {
102 return idx1 <= idx2 ? e1: e2;
105 _prepend: function(param) {
106 var documentElement = require('./documentElement'),
108 if(param instanceof documentElement.DocumentElement) {
111 element = this.element.createElement(param, {mirror: this.mirrors});//
114 this.dom.prepend(element.dom);
118 _childIndex: function(child) {
119 var children = this.children(),
121 children.forEach(function(c, idx) {
122 if(c.sameNode(child)) {
129 containsBlock: function() {
130 var documentElement = require('./documentElement');
131 return this.children()
132 .filter(function(child) {
133 return child instanceof documentElement.DocumentNodeElement;
135 .some(function(child) {
136 if(child.isBlock()) {
139 return child.containsBlock();
143 children: function() {
144 var element = this.element.canvas,
146 this.dom.contents().each(function() {
147 var childElement = element.getDocumentElement(this);
148 if(childElement === undefined) {
152 toret.push(childElement);
159 create: function(nodes, params, element) {
160 return new Container(nodes, params, element);