X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/7775c06d48eb6f310a8ba03d476fd9fcd36b3bc8..b677623848ccd30c937b3dec01cce10f66251279:/src/editor/modules/documentCanvas/canvas/canvas.js?ds=inline diff --git a/src/editor/modules/documentCanvas/canvas/canvas.js b/src/editor/modules/documentCanvas/canvas/canvas.js index 9d33856..d3376e3 100644 --- a/src/editor/modules/documentCanvas/canvas/canvas.js +++ b/src/editor/modules/documentCanvas/canvas/canvas.js @@ -3,6 +3,7 @@ define([ 'libs/underscore', 'libs/backbone', 'fnpjs/logging/logging', +'views/menu/menu', 'modules/documentCanvas/canvas/documentElement', 'modules/documentCanvas/canvas/keyboard', 'modules/documentCanvas/canvas/utils', @@ -12,9 +13,10 @@ define([ 'modules/documentCanvas/canvas/nullElement', 'modules/documentCanvas/canvas/gutter', 'modules/documentCanvas/canvas/selection', +'modules/documentCanvas/canvas/keyEvent', 'libs/text!./canvas.html' -], function($, _, Backbone, logging, documentElement, keyboard, utils, wlxmlListener, ElementsRegister, genericElement, nullElement, gutter, selection, canvasTemplate) { - +], function($, _, Backbone, logging, Menu, documentElement, keyboard, utils, wlxmlListener, ElementsRegister, genericElement, nullElement, gutter, selection, keyEvent, canvasTemplate) { + 'use strict'; /* global document:false, window:false, Node:false, gettext */ @@ -61,8 +63,9 @@ $.extend(TextHandler.prototype, { }); -var Canvas = function(wlxmlDocument, elements, metadata) { +var Canvas = function(wlxmlDocument, elements, metadata, sandbox) { this.metadata = metadata || {}; + this.sandbox = sandbox; this.elementsRegister = new ElementsRegister(documentElement.DocumentNodeElement, nullElement); elements = [ @@ -146,7 +149,6 @@ $.extend(Canvas.prototype, Backbone.Events, { this.rootWrapper.append(this.rootElement.dom); }, - triggerKeyEvent: function(keyEvent, selection) { selection = selection || this.getSelection(); if(selection && (selection.type === 'caret' || selection.type === 'textSelection') && selection.toDocumentFragment().isValid()) { @@ -154,15 +156,16 @@ $.extend(Canvas.prototype, Backbone.Events, { } }, + createAction: function(fqName, config) { + return this.sandbox.createAction(fqName, config); + }, + setupEventHandling: function() { var canvas = this; /* globals document */ $(document.body).on('keydown', function(e) { - var cursor = canvas.getCursor(); - if(cursor.isSelecting() || Object.keys(cursor.getPosition()).length) { - keyboard.handleKey(e, canvas); - } + canvas.triggerKeyEvent(keyEvent.fromNativeEvent(e)); }); this.rootWrapper.on('mouseup', function() { @@ -198,6 +201,17 @@ $.extend(Canvas.prototype, Backbone.Events, { } }); + this.rootWrapper.on('contextmenu', function(e) { + var el = canvas.getDocumentElement(e.target); + + if(!el) { + return; + } + + e.preventDefault(); + this.showContextMenu(el, {x: e.clientX, y: e.clientY}); + }.bind(this)); + this.rootWrapper.on('paste', function(e) { e.preventDefault(); @@ -456,6 +470,18 @@ $.extend(Canvas.prototype, Backbone.Events, { if(position.element) { this._moveCaretToTextElement(position.element, position.offset); } + }, + showContextMenu: function(element, coors) { + var menu = new Menu(); + + while(element) { + (element.contextMenuActions || []).forEach(menu.addAction.bind(menu)); + element = element.parent(); + } + if(menu.actions.length) { + menu.updateContextParam('fragment', this.getSelection().toDocumentFragment()); + this.sandbox.showContextMenu(menu, {x: coors.x, y: coors.y}); + } } }); @@ -587,8 +613,8 @@ $.extend(Cursor.prototype, { }); return { - fromXMLDocument: function(wlxmlDocument, elements, metadata) { - return new Canvas(wlxmlDocument, elements, metadata); + fromXMLDocument: function(wlxmlDocument, elements, metadata, sandbox) { + return new Canvas(wlxmlDocument, elements, metadata, sandbox); } };