JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.0.1
[ckeditor.git] / _source / skins / kama / skin.js
index b06443a..63ab4a0 100644 (file)
@@ -25,15 +25,9 @@ CKEDITOR.skins.add( 'kama', (function()
                        if ( editor.config.width && !isNaN( editor.config.width ) )\r
                                editor.config.width -= 12;\r
 \r
-                       var menuHead;\r
-                       function menuSetUiColor( color )\r
-                       {\r
-                               if ( !menuHead )\r
-                                       return null;\r
-\r
-                               var uiStyle = menuHead.append('style');\r
-\r
-                               var cssSrc = "/* UI Color Support */\\r
+                       var uiColorMenus = [];\r
+                       var uiColorRegex = /\$color/g;\r
+                       var uiColorMenuCss = "/* UI Color Support */\\r
 .cke_skin_kama .cke_menuitem .cke_icon_wrapper\\r
 {\\r
        background-color: $color !important;\\r
@@ -87,40 +81,59 @@ CKEDITOR.skins.add( 'kama', (function()
 {\\r
        background-color: $color !important;\\r
 }";\r
+                       // We have to split CSS declarations for webkit.\r
+                       if ( CKEDITOR.env.webkit )\r
+                       {\r
+                               uiColorMenuCss = uiColorMenuCss.split( '}' ).slice( 0, -1 );\r
+                               for ( var i = 0 ; i < uiColorMenuCss.length ; i++ )\r
+                                       uiColorMenuCss[ i ] = uiColorMenuCss[ i ].split( '{' );\r
+                       }\r
 \r
-                               uiStyle.setAttribute( "type", "text/css" );\r
-                               var regex = /\$color/g;\r
+                       function addStylesheet( document )\r
+                       {\r
+                               var node = document.getHead().append( 'style' );\r
+                               node.setAttribute( "id", "cke_ui_color" );\r
+                               node.setAttribute( "type", "text/css" );\r
 \r
-                               // We have to split CSS declarations for webkit.\r
-                               if ( CKEDITOR.env.webkit )\r
-                               {\r
-                                       cssSrc = cssSrc.split( '}' ).slice( 0, -1 );\r
-                                       for ( var i in cssSrc )\r
-                                                       cssSrc[ i ] = cssSrc[ i ].split( '{' );\r
-                               }\r
+                               return node;\r
+                       }\r
 \r
-                               return ( menuSetUiColor =\r
-                                       function( color )\r
+                       function updateStylesheets( styleNodes, styleContent, replace )\r
+                       {\r
+                               var r, i, content;\r
+                               for ( var id  = 0 ; id < styleNodes.length ; id++ )\r
+                               {\r
+                                       if ( CKEDITOR.env.webkit )\r
                                        {\r
-                                               if ( CKEDITOR.env.webkit )\r
-                                               {\r
-                                                       for ( var i in cssSrc )\r
-                                                               uiStyle.$.sheet.addRule(\r
-                                                                       cssSrc[ i ][ 0 ], cssSrc[ i ][ 1 ].replace( regex, color )\r
-                                                               );\r
-                                               }\r
-                                               else\r
+                                               // Truncate manually.\r
+                                               for ( i = 0 ; i < styleNodes[ id ].$.sheet.rules.length ; i++ )\r
+                                                       styleNodes[ id ].$.sheet.removeRule( i );\r
+\r
+                                               for ( i = 0 ; i < styleContent.length ; i++ )\r
                                                {\r
-                                                       var css = cssSrc.replace( regex, color );\r
+                                                       content = styleContent[ i ][ 1 ];\r
+                                                       for ( r  = 0 ; r < replace.length ; r++ )\r
+                                                               content = content.replace( replace[ r ][ 0 ], replace[ r ][ 1 ] );\r
 \r
-                                                       if ( CKEDITOR.env.ie )\r
-                                                               uiStyle.$.styleSheet.cssText = css;\r
-                                                       else\r
-                                                               uiStyle.setHtml( css );\r
+                                                       styleNodes[ id ].$.sheet.addRule( styleContent[ i ][ 0 ], content );\r
                                                }\r
-                                       })( color );\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               content = styleContent;\r
+                                               for ( r  = 0 ; r < replace.length ; r++ )\r
+                                                       content = content.replace( replace[ r ][ 0 ], replace[ r ][ 1 ] );\r
+\r
+                                               if ( CKEDITOR.env.ie )\r
+                                                       styleNodes[ id ].$.styleSheet.cssText = content;\r
+                                               else\r
+                                                       styleNodes[ id ].setHtml( content );\r
+                                       }\r
+                               }\r
                        }\r
 \r
+                       var uiColorRegexp = /\$color/g;\r
+\r
                        CKEDITOR.tools.extend( editor,\r
                        {\r
                                uiColor: null,\r
@@ -132,7 +145,8 @@ CKEDITOR.skins.add( 'kama', (function()
 \r
                                setUiColor : function( color )\r
                                {\r
-                                       var uiStyle = CKEDITOR.document.getHead().append('style'),\r
+                                       var cssContent,\r
+                                               uiStyle = addStylesheet( CKEDITOR.document ),\r
                                                cssId = '#cke_' + editor.name.replace('.', '\\.');\r
 \r
                                        var cssSelectors =\r
@@ -144,76 +158,47 @@ CKEDITOR.skins.add( 'kama', (function()
                                                ].join( ',' );\r
                                        var cssProperties = "background-color: $color !important;";\r
 \r
-                                       uiStyle.setAttribute("type", "text/css");\r
+                                       if ( CKEDITOR.env.webkit )\r
+                                               cssContent = [ [ cssSelectors, cssProperties ] ];\r
+                                       else\r
+                                               cssContent = cssSelectors + '{' + cssProperties + '}';\r
 \r
                                        return ( this.setUiColor =\r
                                                function( color )\r
                                                {\r
-                                                       var css = cssProperties.replace( '$color', color );\r
+                                                       var replace = [ [ uiColorRegexp, color ] ];\r
                                                        editor.uiColor = color;\r
 \r
-                                                       if ( CKEDITOR.env.ie )\r
-                                                               uiStyle.$.styleSheet.cssText = cssSelectors + '{' + css + '}';\r
-                                                       else if ( CKEDITOR.env.webkit )\r
-                                                               uiStyle.$.sheet.addRule( cssSelectors, css );\r
-                                                       else\r
-                                                               uiStyle.setHtml( cssSelectors + '{' + css + '}' );\r
+                                                       // Update general style.\r
+                                                       updateStylesheets( [ uiStyle ], cssContent, replace );\r
 \r
-                                                       menuSetUiColor( color );\r
+                                                       // Update menu styles.\r
+                                                       updateStylesheets( uiColorMenus, uiColorMenuCss, replace );\r
                                                })( color );\r
                                }\r
                        });\r
 \r
-                       // If the "menu" plugin is loaded, register the listeners.\r
-                       if ( CKEDITOR.menu )\r
+                       editor.on( 'menuShow', function( event )\r
                        {\r
-                               var old = CKEDITOR.menu.prototype.show;\r
+                               var panel = event.data[ 0 ];\r
+                               var iframe = panel.element.getElementsByTag( 'iframe' ).getItem( 0 ).getFrameDocument();\r
 \r
-                               CKEDITOR.menu.prototype.show = function()\r
+                               // Add stylesheet if missing.\r
+                               if ( !iframe.getById( 'cke_ui_color' ) )\r
                                {\r
-                                       old.apply( this, arguments );\r
+                                       var node = addStylesheet( iframe );\r
+                                       uiColorMenus.push( node );\r
 \r
-                                       if ( !menuHead && editor == this.editor )\r
-                                       {\r
-                                               // Save reference.\r
-                                               menuHead = this._.element.getDocument().getHead();\r
-                                               menuSetUiColor( editor.getUiColor() );\r
-                                       }\r
-                               };\r
-                       }\r
+                                       var color = editor.getUiColor();\r
+                                       // Set uiColor for new menu.\r
+                                       if ( color )\r
+                                               updateStylesheets( [ node ], uiColorMenuCss, [ [ uiColorRegexp, color ] ] );\r
+                               }\r
+                       });\r
 \r
                        // Apply UI color if specified in config.\r
                        if ( editor.config.uiColor )\r
                                editor.setUiColor( editor.config.uiColor );\r
-\r
-                       // Fix editor's width. HPadding and 100% width iframe issue.\r
-//                     if ( CKEDITOR.env.ie && CKEDITOR.env.quirks )\r
-//                     {\r
-//                             editor.on( 'mode', function( event )\r
-//                             {\r
-//                                     var container = editor.getResizable();\r
-//                                     editor.resize( container.$.offsetWidth-10, container.$.offsetHeight );\r
-//                                     event.removeListener();\r
-//                             });\r
-//                     }\r
-\r
-//                     if ( CKEDITOR.env.ie && ( CKEDITOR.env.quirks || CKEDITOR.env.version < 7 ) )\r
-//                     {\r
-//                             editor.on( 'themeLoaded', function( event )\r
-//                             {\r
-//                                     var toolbars = editor.container.getChild( [0, 0, 0, 0, 0, 0, 0] ).getChildren();\r
-//                                     for ( var i = 0 ; i < toolbars.count() ; i++ )\r
-//                                     {\r
-//                                             var toolbar = toolbars.getItem( i );\r
-\r
-//                                             var last = toolbar.getLast();\r
-//                                             if ( !last || !last.getPrevious().hasClass( 'cke_rcombo' ) )\r
-//                                                     continue;\r
-//\r
-//                                             last.addClass( 'cke_toolbar_end_last' );\r
-//                                     }\r
-//                             });\r
-//                     }\r
                }\r
        };\r
 })() );\r