X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/d3947bc013df7edd54b46deed8230d2eeafc5ecb..HEAD:/wp-includes/js/tinymce/themes/modern/theme.js?ds=sidebyside diff --git a/wp-includes/js/tinymce/themes/modern/theme.js b/wp-includes/js/tinymce/themes/modern/theme.js index adfeb271..0e079f63 100644 --- a/wp-includes/js/tinymce/themes/modern/theme.js +++ b/wp-includes/js/tinymce/themes/modern/theme.js @@ -391,8 +391,55 @@ tinymce.ThemeManager.add('modern', function(editor) { }); } + function togglePositionClass(panel, relPos, predicate) { + relPos = relPos ? relPos.substr(0, 2) : ''; + + each({ + t: 'down', + b: 'up' + }, function(cls, pos) { + panel.classes.toggle('arrow-' + cls, predicate(pos, relPos.substr(0, 1))); + }); + + each({ + l: 'left', + r: 'right' + }, function(cls, pos) { + panel.classes.toggle('arrow-' + cls, predicate(pos, relPos.substr(1, 1))); + }); + } + + function toClientRect(geomRect) { + return { + left: geomRect.x, + top: geomRect.y, + width: geomRect.w, + height: geomRect.h, + right: geomRect.x + geomRect.w, + bottom: geomRect.y + geomRect.h + }; + } + + function userConstrain(x, y, elementRect, contentAreaRect, panelRect) { + panelRect = toClientRect({x: x, y: y, w: panelRect.w, h: panelRect.h}); + + if (settings.inline_toolbar_position_handler) { + panelRect = settings.inline_toolbar_position_handler({ + elementRect: toClientRect(elementRect), + contentAreaRect: toClientRect(contentAreaRect), + panelRect: panelRect + }); + } + + return panelRect; + } + + function movePanelTo(panel, pos) { + panel.moveTo(pos.left, pos.top); + } + function reposition(match) { - var relPos, panelRect, elementRect, contentAreaRect, panel, relRect, testPositions; + var relPos, panelRect, elementRect, contentAreaRect, panel, relRect, testPositions, smallElementWidthThreshold; if (editor.removed) { return; @@ -404,7 +451,7 @@ tinymce.ThemeManager.add('modern', function(editor) { } testPositions = [ - 'tc-bc', 'bc-tc', + 'bc-tc', 'tc-bc', 'tl-bl', 'bl-tl', 'tr-br', 'br-tr' ]; @@ -415,6 +462,7 @@ tinymce.ThemeManager.add('modern', function(editor) { elementRect = getElementRect(match.element); panelRect = tinymce.DOM.getRect(panel.getEl()); contentAreaRect = tinymce.DOM.getRect(editor.getContentAreaContainer() || editor.getBody()); + smallElementWidthThreshold = 25; // We need to use these instead of the rect values since the style // size properites might not be the same as the real size for a table @@ -426,44 +474,41 @@ tinymce.ThemeManager.add('modern', function(editor) { } // Inflate the elementRect so it doesn't get placed above resize handles - if (editor.selection.controlSelection.isResizable(match.element)) { + if (editor.selection.controlSelection.isResizable(match.element) && elementRect.w < smallElementWidthThreshold) { elementRect = Rect.inflate(elementRect, 0, 8); } relPos = Rect.findBestRelativePosition(panelRect, elementRect, contentAreaRect, testPositions); + elementRect = Rect.clamp(elementRect, contentAreaRect); if (relPos) { - each(testPositions.concat('inside'), function(pos) { - panel.classes.toggle('tinymce-inline-' + pos, pos == relPos); - }); - relRect = Rect.relativePosition(panelRect, elementRect, relPos); - panel.moveTo(relRect.x, relRect.y); + movePanelTo(panel, userConstrain(relRect.x, relRect.y, elementRect, contentAreaRect, panelRect)); } else { - each(testPositions, function(pos) { - panel.classes.toggle('tinymce-inline-' + pos, false); - }); - - panel.classes.toggle('tinymce-inline-inside', true); + // Allow overflow below the editor to avoid placing toolbars ontop of tables + contentAreaRect.h += panelRect.h; elementRect = Rect.intersect(contentAreaRect, elementRect); - if (elementRect) { relPos = Rect.findBestRelativePosition(panelRect, elementRect, contentAreaRect, [ - 'tc-tc', 'tl-tl', 'tr-tr' + 'bc-tc', 'bl-tl', 'br-tr' ]); if (relPos) { relRect = Rect.relativePosition(panelRect, elementRect, relPos); - panel.moveTo(relRect.x, relRect.y); + movePanelTo(panel, userConstrain(relRect.x, relRect.y, elementRect, contentAreaRect, panelRect)); } else { - panel.moveTo(elementRect.x, elementRect.y); + movePanelTo(panel, userConstrain(elementRect.x, elementRect.y, elementRect, contentAreaRect, panelRect)); } } else { panel.hide(); } } + togglePositionClass(panel, relPos, function(pos1, pos2) { + return pos1 === pos2; + }); + //drawRect(contentAreaRect, 'blue'); //drawRect(elementRect, 'red'); //drawRect(panelRect, 'green'); @@ -503,8 +548,9 @@ tinymce.ThemeManager.add('modern', function(editor) { panel = Factory.create({ type: 'floatpanel', - role: 'application', - classes: 'tinymce tinymce-inline', + role: 'dialog', + classes: 'tinymce tinymce-inline arrow', + ariaLabel: 'Inline toolbar', layout: 'flex', direction: 'column', align: 'stretch', @@ -512,7 +558,10 @@ tinymce.ThemeManager.add('modern', function(editor) { autofix: true, fixed: true, border: 1, - items: createToolbar(match.toolbar.items) + items: createToolbar(match.toolbar.items), + oncancel: function() { + editor.focus(); + } }); match.toolbar.panel = panel; @@ -587,6 +636,13 @@ tinymce.ThemeManager.add('modern', function(editor) { editor.contextToolbars = {}; }); + + editor.shortcuts.add('ctrl+shift+e > ctrl+shift+p', '', function() { + var match = findFrontMostMatch(editor.selection.getNode()); + if (match && match.toolbar.panel) { + match.toolbar.panel.items()[0].focus(); + } + }); } function fireSkinLoaded(editor) { @@ -792,7 +848,7 @@ tinymce.ThemeManager.add('modern', function(editor) { // Add statusbar if needed if (settings.statusbar !== false) { panel.add({type: 'panel', name: 'statusbar', classes: 'statusbar', layout: 'flow', border: '1 0 0 0', ariaRoot: true, items: [ - {type: 'elementpath'}, + {type: 'elementpath', editor: editor}, resizeHandleCtrl ]}); }