JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.4.2
[ckeditor.git] / _source / plugins / specialchar / dialogs / specialchar.js
index 597f7e1..0fba305 100644 (file)
@@ -11,6 +11,33 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
         */\r
        var dialog,\r
                lang = editor.lang.specialChar;\r
+\r
+       var insertSpecialChar = function ( specialChar )\r
+       {\r
+               var selection = editor.getSelection(),\r
+                       ranges = selection.getRanges( true ),\r
+                       range, textNode;\r
+\r
+               editor.fire( 'saveSnapshot' );\r
+\r
+               for ( var i = ranges.length - 1; i >= 0 ; i-- )\r
+               {\r
+                       range = ranges[ i ];\r
+                       range.deleteContents();\r
+\r
+                       textNode = CKEDITOR.dom.element.createFromHtml( specialChar );\r
+                       range.insertNode( textNode );\r
+               }\r
+\r
+               if ( range )\r
+               {\r
+                       range.moveToPosition( textNode, CKEDITOR.POSITION_AFTER_END );\r
+                       range.select();\r
+               }\r
+\r
+               editor.fire( 'saveSnapshot' );\r
+       };\r
+\r
        var onChoice = function( evt )\r
        {\r
                var target, value;\r
@@ -23,7 +50,12 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                {\r
                        target.removeClass( "cke_light_background" );\r
                        dialog.hide();\r
-                       editor.insertHtml( value );\r
+\r
+                       // Firefox has bug on insert chars into a element use its own API. (#5170)\r
+                       if ( CKEDITOR.env.gecko )\r
+                               insertSpecialChar( value );\r
+                       else\r
+                               editor.insertHtml( value );\r
                }\r
        };\r
 \r
@@ -80,7 +112,8 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                // Get an Anchor element.\r
                var element = ev.getTarget();\r
                var relative, nodeToMove;\r
-               var keystroke = ev.getKeystroke();\r
+               var keystroke = ev.getKeystroke(),\r
+                       rtl = editor.lang.dir == 'rtl';\r
 \r
                switch ( keystroke )\r
                {\r
@@ -119,7 +152,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                break;\r
 \r
                        // RIGHT-ARROW\r
-                       case 39 :\r
+                       case rtl ? 37 : 39 :\r
                        // TAB\r
                        case 9 :\r
                                // relative is TD\r
@@ -153,7 +186,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                break;\r
 \r
                        // LEFT-ARROW\r
-                       case 37 :\r
+                       case rtl ? 39 : 37 :\r
                        // SHIFT + TAB\r
                        case CKEDITOR.SHIFT + 9 :\r
                                // relative is TD\r
@@ -232,7 +265,8 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                        var columns = this.definition.charColumns,\r
                                chars = this.definition.chars;\r
 \r
-                       var html = [ '<table role="listbox" aria-labelledby="specialchar_table_label"' +\r
+                       var charsTableLabel =  CKEDITOR.tools.getNextId() + '_specialchar_table_label';\r
+                       var html = [ '<table role="listbox" aria-labelledby="' + charsTableLabel + '"' +\r
                                                                        ' style="width: 320px; height: 100%; border-collapse: separate;"' +\r
                                                                        ' align="center" cellspacing="2" cellpadding="2" border="0">' ];\r
 \r
@@ -259,12 +293,14 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                // Use character in case description unavailable.\r
                                                charDesc = charDesc || character;\r
 \r
+                                               var charLabelId =  'cke_specialchar_label_' + i + '_' + CKEDITOR.tools.getNextNumber();\r
+\r
                                                html.push(\r
-                                                       '<td class="cke_dark_background" style="cursor: default">' +\r
+                                                       '<td class="cke_dark_background" style="cursor: default" role="presentation">' +\r
                                                        '<a href="javascript: void(0);" role="option"' +\r
                                                        ' aria-posinset="' + ( i +1 ) + '"',\r
                                                        ' aria-setsize="' + size + '"',\r
-                                                       ' aria-labelledby="cke_specialchar_label_' + i + '"',\r
+                                                       ' aria-labelledby="' + charLabelId + '"',\r
                                                        ' style="cursor: inherit; display: block; height: 1.25em; margin-top: 0.25em; text-align: center;" title="', CKEDITOR.tools.htmlEncode( charDesc ), '"' +\r
                                                        ' onkeydown="CKEDITOR.tools.callFunction( ' + onKeydown + ', event, this )"' +\r
                                                        ' onclick="CKEDITOR.tools.callFunction(' + onClick + ', this); return false;"' +\r
@@ -272,7 +308,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                        '<span style="margin: 0 auto;cursor: inherit">' +\r
                                                        character +\r
                                                        '</span>' +\r
-                                                       '<span class="cke_voice_label" id="cke_specialchar_label_' + i + '">' +\r
+                                                       '<span class="cke_voice_label" id="' + charLabelId + '">' +\r
                                                        charDesc +\r
                                                        '</span></a>');\r
                                        }\r
@@ -284,7 +320,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                html.push( '</tr>' );\r
                        }\r
 \r
-                       html.push( '</tbody></table>', '<span id="specialchar_table_label" class="cke_voice_label">' + editor.lang.common.options +'</span>' );\r
+                       html.push( '</tbody></table>', '<span id="' + charsTableLabel + '" class="cke_voice_label">' + lang.options +'</span>' );\r
 \r
                        this.getContentElement( 'info', 'charContainer' ).getElement().setHtml( html.join( '' ) );\r
                },\r
@@ -311,11 +347,11 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                                focus : function()\r
                                                                {\r
                                                                        var firstChar = this.getElement().getElementsByTag( 'a' ).getItem( 0 );\r
-                                                                       setTimeout(function()\r
+                                                                       setTimeout( function()\r
                                                                        {\r
                                                                                firstChar.focus();\r
                                                                                onFocus( null, firstChar );\r
-                                                                       });\r
+                                                                       }, 0 );\r
                                                                },\r
                                                                onShow : function()\r
                                                                {\r
@@ -324,7 +360,7 @@ CKEDITOR.dialog.add( 'specialchar', function( editor )
                                                                                {\r
                                                                                        firstChar.focus();\r
                                                                                        onFocus( null, firstChar );\r
-                                                                               });\r
+                                                                               }, 0 );\r
                                                                },\r
                                                                onLoad : function( event )\r
                                                                {\r