X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/2687ec6cbbe8101a4faa232c79f5c1321dcebe6d..0bea7025f60aa5cc2ed89eed72da0d616f3574ef:/src/editor/modules/documentCanvas/canvas/canvas.js diff --git a/src/editor/modules/documentCanvas/canvas/canvas.js b/src/editor/modules/documentCanvas/canvas/canvas.js index d58ea7b..af1ed28 100644 --- a/src/editor/modules/documentCanvas/canvas/canvas.js +++ b/src/editor/modules/documentCanvas/canvas/canvas.js @@ -3,11 +3,13 @@ define([ 'libs/underscore', 'libs/backbone', 'fnpjs/logging/logging', +'wlxml/wlxml', 'modules/documentCanvas/canvas/documentElement', 'modules/documentCanvas/canvas/keyboard', 'modules/documentCanvas/canvas/utils', -'modules/documentCanvas/canvas/wlxmlListener' -], function($, _, Backbone, logging, documentElement, keyboard, utils, wlxmlListener) { +'modules/documentCanvas/canvas/wlxmlListener', +'modules/documentCanvas/canvas/genericElement' +], function($, _, Backbone, logging, wlxml, documentElement, keyboard, utils, wlxmlListener, genericElement) { 'use strict'; /* global document:false, window:false, Node:false, gettext */ @@ -54,8 +56,49 @@ $.extend(TextHandler.prototype, { }); +var ElementsRegister = function() { + this._register = { + '': ElementsRegister.createCanvasElementType(genericElement, documentElement.DocumentNodeElement) + }; + +} +_.extend(ElementsRegister, { + createCanvasElementType: function(elementPrototype, inheritFrom) { + var Constructor = function() { + if(!this.super) { + this.super = inheritFrom.prototype; + } + inheritFrom.apply(this, Array.prototype.slice.call(arguments, 0)); + + }; + Constructor.prototype = Object.create(inheritFrom.prototype); + _.extend(Constructor.prototype, elementPrototype); + return Constructor; + } +}); +_.extend(ElementsRegister.prototype, { + register: function(klass, elementPrototype) { + this._register[klass] = ElementsRegister.createCanvasElementType(elementPrototype, this.getFactoryFor('')); + }, + getFactoryFor: function(klass) { + var Factory; + wlxml.getClassHierarchy(klass).reverse().some(function(klass) { + Factory = this._register[klass]; + if(Factory) { + return true; + } + }.bind(this)); + return Factory; + } +}); + + -var Canvas = function(wlxmlDocument) { +var Canvas = function(wlxmlDocument, elements) { + this.elementsRegister = new ElementsRegister(); + (elements || []).forEach(function(elementDesc) { + this.elementsRegister.register(elementDesc.klass, elementDesc.element); + }.bind(this)); this.eventBus = _.extend({}, Backbone.Events); this.wrapper = $('
').addClass('canvas-wrapper').attr('contenteditable', true); this.wlxmlListener = wlxmlListener.create(this); @@ -77,7 +120,15 @@ $.extend(Canvas.prototype, Backbone.Events, { }, createElement: function(wlxmlNode) { - var Factory = wlxmlNode.nodeType === Node.TEXT_NODE ? documentElement.DocumentTextElement : documentElement.DocumentNodeElement; + var Factory; + if(wlxmlNode.nodeType === Node.TEXT_NODE) { + Factory = documentElement.DocumentTextElement + } else { + if(wlxmlNode.getClass() === 'p') { + // debugger; + } + Factory = this.elementsRegister.getFactoryFor(wlxmlNode.getClass()); + } return new Factory(wlxmlNode, this); }, @@ -558,8 +609,8 @@ $.extend(Cursor.prototype, { }); return { - fromXMLDocument: function(wlxmlDocument) { - return new Canvas(wlxmlDocument); + fromXMLDocument: function(wlxmlDocument, elements) { + return new Canvas(wlxmlDocument, elements); } };