| | |
| | | } |
| | | |
| | | function fixDeletingFirstCharOfList(ed, e) { |
| | | function listElements(list, li) { |
| | | function listElements(li) { |
| | | var elements = []; |
| | | var walker = new tinymce.dom.TreeWalker(li, list); |
| | | var walker = new tinymce.dom.TreeWalker(li.firstChild, li); |
| | | for (var node = walker.current(); node; node = walker.next()) { |
| | | if (ed.dom.is(node, 'ol,ul,li')) { |
| | | elements.push(node); |
| | |
| | | if (e.keyCode == tinymce.VK.BACKSPACE) { |
| | | var li = getLi(); |
| | | if (li) { |
| | | var list = ed.dom.getParent(li, 'ol,ul'); |
| | | if (list && list.firstChild === li) { |
| | | var elements = listElements(list, li); |
| | | var list = ed.dom.getParent(li, 'ol,ul'), |
| | | rng = ed.selection.getRng(); |
| | | if (list && list.firstChild === li && rng.startOffset == 0) { |
| | | var elements = listElements(li); |
| | | elements.unshift(li); |
| | | ed.execCommand("Outdent", false, elements); |
| | | ed.undoManager.add(); |
| | | return Event.cancel(e); |
| | |
| | | ed.dom.remove(li, true); |
| | | var textNodes = tinymce.grep(prevLi.childNodes, function(n){ return n.nodeType === 3 }); |
| | | if (textNodes.length === 1) { |
| | | var textNode = textNodes[0] |
| | | var textNode = textNodes[0]; |
| | | ed.selection.setCursorLocation(textNode, textNode.length); |
| | | } |
| | | ed.undoManager.add(); |
| | |
| | | } else { |
| | | actions = { |
| | | defaultAction: convertListItemToParagraph, |
| | | elements: this.selectedBlocks() |
| | | elements: this.selectedBlocks(), |
| | | processEvenIfEmpty: true |
| | | }; |
| | | } |
| | | this.process(actions); |
| | |
| | | |
| | | function processElement(element) { |
| | | dom.removeClass(element, '_mce_act_on'); |
| | | if (!element || element.nodeType !== 1 || selectedBlocks.length > 1 && isEmptyElement(element)) { |
| | | if (!element || element.nodeType !== 1 || ! actions.processEvenIfEmpty && selectedBlocks.length > 1 && isEmptyElement(element)) { |
| | | return; |
| | | } |
| | | element = findItemToOperateOn(element, dom); |
| | |
| | | } |
| | | |
| | | function recurse(element) { |
| | | t.splitSafeEach(element.childNodes, processElement); |
| | | t.splitSafeEach(element.childNodes, processElement, true); |
| | | } |
| | | |
| | | function brAtEdgeOfSelection(container, offset) { |
| | |
| | | } |
| | | }, |
| | | |
| | | splitSafeEach: function(elements, f) { |
| | | if (tinymce.isGecko && (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) || |
| | | /Firefox\/3\.[0-4]/.test(navigator.userAgent))) { |
| | | splitSafeEach: function(elements, f, forceClassBase) { |
| | | if (forceClassBase || |
| | | (tinymce.isGecko && |
| | | (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) || |
| | | /Firefox\/3\.[0-4]/.test(navigator.userAgent)))) { |
| | | this.classBasedEach(elements, f); |
| | | } else { |
| | | each(elements, f); |
| | |
| | | }, |
| | | |
| | | selectedBlocks: function() { |
| | | var ed = this.ed |
| | | var selectedBlocks = ed.selection.getSelectedBlocks(); |
| | | var ed = this.ed, selectedBlocks = ed.selection.getSelectedBlocks(); |
| | | return selectedBlocks.length == 0 ? [ ed.dom.getRoot() ] : selectedBlocks; |
| | | }, |
| | | |