| | |
| | | /**
|
| | | * $Id: editor_plugin_src.js 853 2008-05-27 08:05:35Z spocke $
|
| | | * $Id: editor_plugin_src.js 1209 2009-08-20 12:35:10Z spocke $
|
| | | *
|
| | | * @author Moxiecode
|
| | | * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.
|
| | |
| | |
|
| | | (function() {
|
| | | var each = tinymce.each;
|
| | |
|
| | | // Checks if the selection/caret is at the start of the specified block element
|
| | | function isAtStart(rng, par) {
|
| | | var doc = par.ownerDocument, rng2 = doc.createRange(), elm;
|
| | |
|
| | | rng2.setStartBefore(par);
|
| | | rng2.setEnd(rng.endContainer, rng.endOffset);
|
| | |
|
| | | elm = doc.createElement('body');
|
| | | elm.appendChild(rng2.cloneContents());
|
| | |
|
| | | // Check for text characters of other elements that should be treated as content
|
| | | return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0;
|
| | | };
|
| | |
|
| | | tinymce.create('tinymce.plugins.TablePlugin', {
|
| | | init : function(ed, url) {
|
| | |
| | | ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
|
| | | });
|
| | |
|
| | | if (ed.getParam('inline_styles')) {
|
| | | // Force move of attribs to styles in strict mode
|
| | | ed.onPreProcess.add(function(ed, o) {
|
| | | var dom = ed.dom;
|
| | |
|
| | | each(dom.select('table', o.node), function(n) {
|
| | | var v;
|
| | |
|
| | | if (v = dom.getAttrib(n, 'width')) {
|
| | | dom.setStyle(n, 'width', v);
|
| | | dom.setAttrib(n, 'width');
|
| | | }
|
| | |
|
| | | if (v = dom.getAttrib(n, 'height')) {
|
| | | dom.setStyle(n, 'height', v);
|
| | | dom.setAttrib(n, 'height');
|
| | | }
|
| | | });
|
| | | });
|
| | | }
|
| | |
|
| | | ed.onInit.add(function() {
|
| | | // Fixes an issue on Gecko where it's impossible to place the caret behind a table
|
| | | // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
|
| | | if (!tinymce.isIE && ed.getParam('forced_root_block')) {
|
| | | function fixTableCaretPos() {
|
| | | var last = ed.getBody().lastChild;
|
| | |
|
| | | if (last && last.nodeName == 'TABLE')
|
| | | ed.dom.add(ed.getBody(), 'p', null, '<br mce_bogus="1" />');
|
| | | };
|
| | |
|
| | | // Fixes an bug where it's impossible to place the caret before a table in Gecko
|
| | | // this fix solves it by detecting when the caret is at the beginning of such a table
|
| | | // and then manually moves the caret infront of the table
|
| | | if (tinymce.isGecko) {
|
| | | ed.onKeyDown.add(function(ed, e) {
|
| | | var rng, table, dom = ed.dom;
|
| | |
|
| | | // On gecko it's not possible to place the caret before a table
|
| | | if (e.keyCode == 37 || e.keyCode == 38) {
|
| | | rng = ed.selection.getRng();
|
| | | table = dom.getParent(rng.startContainer, 'table');
|
| | |
|
| | | if (table && ed.getBody().firstChild == table) {
|
| | | if (isAtStart(rng, table)) {
|
| | | rng = dom.createRng();
|
| | |
|
| | | rng.setStartBefore(table);
|
| | | rng.setEndBefore(table);
|
| | |
|
| | | ed.selection.setRng(rng);
|
| | |
|
| | | e.preventDefault();
|
| | | }
|
| | | }
|
| | | }
|
| | | });
|
| | | }
|
| | |
|
| | | ed.onKeyUp.add(fixTableCaretPos);
|
| | | ed.onSetContent.add(fixTableCaretPos);
|
| | | ed.onVisualAid.add(fixTableCaretPos);
|
| | |
|
| | | ed.onPreProcess.add(function(ed, o) {
|
| | | var last = o.node.lastChild;
|
| | |
|
| | | if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR')
|
| | | ed.dom.remove(last);
|
| | | });
|
| | |
|
| | | fixTableCaretPos();
|
| | | }
|
| | |
|
| | | if (ed && ed.plugins.contextmenu) {
|
| | | ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
|
| | | var sm, se = ed.selection, el = se.getNode() || ed.getBody();
|
| | |
| | | if (!trElm || !tdElm)
|
| | | return true;
|
| | |
|
| | | var grid = getTableGrid(tableElm);
|
| | | var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));
|
| | | var cpos = getCellPos(grid, tdElm);
|
| | | var lastTDElm = null;
|
| | |
|
| | |
| | | if (!trElm || !tdElm)
|
| | | return true;
|
| | |
|
| | | var grid = getTableGrid(tableElm);
|
| | | var grid = getTableGrid(inst.dom.getParent(tableElm, "table"));
|
| | | var cpos = getCellPos(grid, tdElm);
|
| | | var lastTDElm = null;
|
| | |
|