Ticket #2910: 2910_2.patch

File 2910_2.patch, 19.1 KB (added by Frederico Caldeira Knabben, 11 years ago)
  • _source/core/command.js

     
    77{
    88        this.state = ( 'state' in commandDefinition ) ? commandDefinition.state : CKEDITOR.TRISTATE_OFF;
    99
    10         this.exec = function()
     10        this.exec = function( data )
    1111        {
    12                 commandDefinition.exec.call( this, editor );
     12                return commandDefinition.exec.call( this, editor, data );
    1313        };
    1414
    1515        CKEDITOR.tools.extend( this, commandDefinition );
  • _source/core/config.js

     
    147147         * config.plugins = 'basicstyles,button,htmldataprocessor,toolbar,wysiwygarea';
    148148         */
    149149
    150         plugins : 'basicstyles,blockquote,button,elementspath,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,newpage,pagebreak,preview,print,removeformat,smiley,sourcearea,table,specialchar,tab,toolbar,wysiwygarea',
     150        plugins : 'basicstyles,blockquote,button,clipboard,elementspath,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,newpage,pagebreak,pastetext,preview,print,removeformat,smiley,sourcearea,table,specialchar,tab,toolbar,wysiwygarea',
    151151
    152152        /**
    153153         * The theme to be used to build the UI.
  • _source/core/editor.js

     
    387387                {
    388388                        var command = this.getCommand( commandName );
    389389                        if ( command && command.state != CKEDITOR.TRISTATE_DISABLED )
    390                                 return command.exec( this, data );
     390                                return command.exec( data );
    391391
    392392                        // throw 'Unknown command name "' + commandName + '"';
    393393                        return false;
  • _source/lang/en.js

     
    3131        source                  : 'Source',
    3232        newPage                 : 'New Page',
    3333        preview                 : 'Preview',
     34        cut                             : 'Cut',
     35        copy                    : 'Copy',
     36        paste                   : 'Paste',
    3437        print                   : 'Print',
    3538        underline               : 'Underline',
    3639        bold                    : 'Bold',
     
    390393        },
    391394
    392395        outdent : 'Decrease Indent',
    393         blockquote : 'Blockquote'
     396        blockquote : 'Blockquote',
     397
     398        clipboard :
     399        {
     400                title           : 'Paste',
     401                cutError        : 'Your browser security settings don\'t permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl+X).',
     402                copyError       : 'Your browser security settings don\'t permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl+C).',
     403                pasteMsg        : 'Please paste inside the following box using the keyboard (Ctrl+V) and hit OK',
     404                securityMsg     : 'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.'
     405        },
     406
     407        pasteText :
     408        {
     409                button : 'Paste as plain text',
     410                title : 'Paste as Plain Text'
     411        }
    394412};
  • _source/plugins/clipboard/dialogs/paste.js

     
     1/*
     2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
     3For licensing, see LICENSE.html or http://ckeditor.com/license
     4*/
     5
     6CKEDITOR.dialog.add( 'paste', function( editor )
     7{
     8        var isCustomDomain = CKEDITOR.env.ie && document.domain != window.location.hostname;
     9
     10        var iframeId = 'cke_' + CKEDITOR.tools.getNextNumber();
     11
     12        // For document.domain compatibility (#123) we must do all the magic in
     13        // the URL for IE.
     14        var src =
     15                isCustomDomain ?
     16                        'javascript:void((function(){' +
     17                                'document.open();' +
     18                                'document.domain=\'' + document.domain + '\';' +
     19                                'document.write( window.parent.CKEDITOR._htmlToLoad );' +
     20                                'document.close();' +
     21                                'document.body.contentEditable = true;' +
     22                                'delete window.parent.CKEDITOR._htmlToLoad;' +
     23                                'window.focus();' +
     24                        '})())'
     25                :
     26                        'javascript:void(0)';
     27
     28        var iframeHtml =
     29                '<iframe' +
     30                        ' src="' + src + '"' +
     31                        ' id="' + iframeId + '"' +
     32                        ' style="width:346px;background-color:white;height:130px;border:1px solid black"' +
     33                        ' frameborder="0"' +
     34                        ' allowtransparency="1">' +
     35                '</iframe>';
     36
     37        var htmlToLoad =
     38                '<!doctype html>' +
     39                '<script type="text/javascript">' +
     40                        'window.onload = function()' +
     41                        '{' +
     42                                ( CKEDITOR.env.ie ?
     43                                        'document.body.contentEditable = "true";' :
     44                                        'document.designMode = "on";' ) +
     45                                'window.focus();' +
     46                        '};' +
     47                        // Avoid errors if the pasted content has any script that
     48                        // fails. (#389)
     49                        'window.onerror = function()' +
     50                        '{' +
     51                                'return true;' +
     52                        '};' +
     53                '</script><body style="margin:3px"></body>';
     54
     55        return {
     56                title : editor.lang.clipboard.title,
     57
     58                minWidth : 400,
     59                minHeight : 330,
     60
     61                onShow : function()
     62                {
     63                        if ( isCustomDomain )
     64                                CKEDITOR._htmlToLoad = htmlToLoad;
     65                        else
     66                        {
     67                                var iframe = CKEDITOR.document.getById( iframeId );
     68
     69                                var $doc = iframe.$.contentWindow.document;
     70                                $doc.open();
     71                                $doc.write( htmlToLoad );
     72                                $doc.close();
     73
     74                                iframe.$.contentWindow.focus();
     75                        }
     76                },
     77
     78                onOk : function()
     79                {
     80                        var iframe = CKEDITOR.document.getById( iframeId );
     81
     82                        var body = new CKEDITOR.dom.element(
     83                                iframe.$.contentDocument ?
     84                                        oBody = iframe.$.contentDocument.body :
     85                                        oBody = iframe.$.contentWindow.document.body ) ;
     86                                       
     87                        var html = body.getHtml();
     88
     89                        // Fix relative anchor URLs (IE automatically adds the current page URL).
     90                        var re = new RegExp( window.location + "#", 'g' );
     91                        html = html.replace( re, '#');
     92
     93                        this.restoreSelection();
     94                        this.clearSavedSelection();
     95
     96                        this.getParentEditor().insertHtml( html );
     97                },
     98
     99                contents : [
     100                        {
     101                                id : 'general',
     102                                label : editor.lang.common.generalTab,
     103                                elements : [
     104                                        {
     105                                                type : 'html',
     106                                                id : 'securityMsg',
     107                                                html : '<div style="white-space:normal;width:340px;">' + editor.lang.clipboard.securityMsg + '</div>'
     108                                        },
     109                                        {
     110                                                type : 'html',
     111                                                id : 'pasteMsg',
     112                                                html : '<div style="white-space:normal;width:340px;">'+editor.lang.clipboard.pasteMsg +'</div>'
     113                                        },
     114                                        {
     115                                                type : 'html',
     116                                                id : 'content',
     117                                                style : 'width:340px;height:130px',
     118                                                html : '<div>' + iframeHtml + '</div>'
     119                                        }
     120                                ]
     121                        }
     122                ]
     123        };
     124});
     125 No newline at end of file
  • _source/plugins/clipboard/plugin.js

     
     1/*
     2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
     3For licensing, see LICENSE.html or http://ckeditor.com/license
     4*/
     5
     6/**
     7 * @file Clipboard support
     8 */
     9
     10(function()
     11{
     12        // Tries to execute any of the paste, cut or copy commands in IE. Returns a
     13        // boolean indicating that the operation succeeded.
     14        var execIECommand = function( editor, command )
     15        {
     16                var doc = editor.document,
     17                        body = doc.getBody();
     18
     19                var     enabled = false;
     20                var onExec = function()
     21                {
     22                        enabled = true;
     23                };
     24               
     25                // The following seems to be the only reliable way to detect that
     26                // clipboard commands are enabled in IE. It will fire the
     27                // onpaste/oncut/oncopy events only if the security settings allowed
     28                // the command to execute.
     29                body.on( command, onExec );
     30
     31                doc.$.execCommand( command );
     32
     33                body.removeListener( command, onExec );
     34               
     35                return enabled;
     36        };
     37
     38        // Attempts to execute the Cut and Copy operations.
     39        var tryToCutCopy =
     40                CKEDITOR.env.ie ?
     41                        function( editor, type )
     42                        {
     43                                return execIECommand( editor, type );
     44                        }
     45                :               // !IE.
     46                        function( editor, type )
     47                        {
     48                                try
     49                                {
     50                                        // Other browsers throw an error if the command is disabled.
     51                                        return editor.document.$.execCommand( type );
     52                                }
     53                                catch( e )
     54                                {
     55                                        return false;
     56                                }
     57                        };
     58
     59        // A class that represents one of the cut or copy commands.
     60        var cutCopyCmd = function( type )
     61        {
     62                this.type = type;
     63        };
     64
     65        cutCopyCmd.prototype =
     66        {
     67                exec : function( editor, data )
     68                {
     69                        var success = tryToCutCopy( editor, this.type );
     70
     71                        if ( !success )
     72                                alert( editor.lang.clipboard[ this.type + 'Error' ] );          // Show cutError or copyError.
     73
     74                        return success;
     75                }
     76        };
     77
     78        // Paste command.
     79        var pasteCmd =
     80                CKEDITOR.env.ie ?
     81                        {
     82                                exec : function( editor, data )
     83                                {
     84                                        // Prevent IE from pasting at the begining of the document.
     85                                        editor.focus();
     86
     87                                        if ( !editor.fire( 'beforePaste' )
     88                                                && !execIECommand( editor, 'paste' ) )
     89                                        {
     90                                                        editor.openDialog( 'paste' );
     91                                        }
     92                                }
     93                        }
     94                :
     95                        {
     96                                exec : function( editor )
     97                                {
     98                                        try
     99                                        {
     100                                                if ( !editor.fire( 'beforePaste' )
     101                                                        && !editor.document.$.execCommand( 'Paste', false, null ) )
     102                                                {
     103                                                        throw 0;
     104                                                }
     105                                        }
     106                                        catch ( e )
     107                                        {
     108                                                // Open the paste dialog.
     109                                                editor.openDialog( 'paste' );
     110                                        }
     111                                }
     112                        };
     113
     114        // Listens for some clipboard related keystrokes, so they get customized.
     115        var onKey = function( event )
     116        {
     117                switch ( event.data.keyCode )
     118                {
     119                        // Paste
     120                        case CKEDITOR.CTRL + 86 :               // CTRL+V
     121                        case CKEDITOR.SHIFT + 45 :              // SHIFT+INS
     122                                if ( this.fire( 'beforePaste' ) )
     123                                        event.cancel();
     124                                return;
     125
     126                        // Cut
     127                        case CKEDITOR.CTRL + 88 :               // CTRL+X
     128                        case CKEDITOR.SHIFT + 46 :              // SHIFT+DEL
     129                                // Save Undo snapshot.
     130                }
     131        };
     132
     133        // Register the plugin.
     134        CKEDITOR.plugins.add( 'clipboard',
     135                {
     136                        init : function( editor )
     137                        {
     138                                var addButtonCommand = function ( buttonName, commandName, command )
     139                                {
     140                                        editor.addCommand( commandName, command );
     141                                        editor.ui.addButton( buttonName,
     142                                                {
     143                                                        label : editor.lang[ commandName ],
     144                                                        command : commandName
     145                                                });
     146                                }
     147
     148                                addButtonCommand( 'Cut', 'cut', new cutCopyCmd( 'cut' ) );
     149                                addButtonCommand( 'Copy', 'copy', new cutCopyCmd( 'copy' ) );
     150                                addButtonCommand( 'Paste', 'paste', pasteCmd );
     151
     152                                CKEDITOR.dialog.add( 'paste', CKEDITOR.getUrl( this.path + 'dialogs/paste.js' ) );
     153
     154                                editor.on( 'key', onKey, editor );
     155                        }
     156                });
     157})();
  • _source/plugins/keystrokes/plugin.js

     
    7575
    7676(function()
    7777{
     78        var cancel;
     79
    7880        var onKeyDown = function( event )
    7981        {
    8082                // The DOM event object is passed by the "data" property.
     
    8385                var keyCombination = event.getKeystroke();
    8486                var command = this.keystrokes[ keyCombination ];
    8587
    86                 var cancel = !this._.editor.fire( 'key', { keyCode : keyCombination } );
     88                cancel = ( this._.editor.fire( 'key', { keyCode : keyCombination } ) === true );
    8789
    8890                if ( !cancel )
    8991                {
    9092                        if ( command )
    91                                 cancel = ( this._.editor.execCommand( command ) !== false );
     93                        {
     94                                var data = { from : 'keystrokeHandler' };
     95                                cancel = ( this._.editor.execCommand( command, data ) !== false );
     96                        }
    9297
    9398                        if ( !cancel )
    9499                                cancel = !!this.blockedKeystrokes[ keyCombination ];
     
    100105                return !cancel;
    101106        };
    102107
     108        var onKeyPress = function( event )
     109        {
     110                if ( cancel )
     111                {
     112                        cancel = false;
     113                        event.data.preventDefault( true );
     114                }
     115        };
     116
    103117        CKEDITOR.keystrokeHandler.prototype =
    104118        {
    105119                /**
     
    111125                 */
    112126                attach : function( domObject )
    113127                {
     128                        // For most browsers, it is enough to listen to the keydown event
     129                        // only.
    114130                        domObject.on( 'keydown', onKeyDown, this );
     131
     132                        // Some browsers instead, don't cancel key events in the keydown, but in the
     133                        // keypress. So we must do a longer trip in those cases.
     134                        if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
     135                                domObject.on( 'keypress', onKeyPress, this );
    115136                }
    116137        };
    117138})();
     
    142163        [ CKEDITOR.ALT + 121 /*F10*/, 'toolbarFocus' ],
    143164        [ CKEDITOR.ALT + 122 /*F11*/, 'elementsPathFocus' ],
    144165
    145         [ CKEDITOR.CTRL + 86 /*V*/, 'paste' ],
    146         [ CKEDITOR.SHIFT + 45 /*INS*/, 'paste' ],
    147         [ CKEDITOR.CTRL + 88 /*X*/, 'cut' ],
    148         [ CKEDITOR.SHIFT + 46 /*DEL*/, 'cut' ],
    149166        [ CKEDITOR.CTRL + 90 /*Z*/, 'undo' ],
    150167        [ CKEDITOR.CTRL + 89 /*Y*/, 'redo' ],
    151168        [ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/, 'redo' ],
  • _source/plugins/pastetext/dialogs/pastetext.js

     
     1/*
     2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
     3For licensing, see LICENSE.html or http://ckeditor.com/license
     4*/
     5
     6(function()
     7{
     8        CKEDITOR.dialog.add( 'pastetext', function( editor )
     9                {
     10                        var textareaId = 'cke_' + CKEDITOR.tools.getNextNumber();
     11
     12                        return {
     13                                title : editor.lang.pasteText.title,
     14
     15                                minWidth : 400,
     16                                minHeight : 330,
     17                               
     18                                onShow : function()
     19                                {
     20                                        // Reset the textarea value.
     21                                        CKEDITOR.document.getById( textareaId ).setValue( '' );
     22                                },
     23
     24                                onOk : function()
     25                                {
     26                                        // Get the textarea value.
     27                                        var text = CKEDITOR.document.getById( textareaId ).getValue();
     28
     29                                        // Restore the editing area selection.
     30                                        this.restoreSelection();
     31                                        this.clearSavedSelection();
     32
     33                                        // Inserts the text.
     34                                        this.getParentEditor().insertText( text );
     35                                },
     36
     37                                contents :
     38                                [
     39                                        {
     40                                                label : editor.lang.common.generalTab,
     41                                                elements :
     42                                                [
     43                                                        {
     44                                                                type : 'html',
     45                                                                id : 'pasteMsg',
     46                                                                html : '<div style="white-space:normal;width:340px;">' + editor.lang.clipboard.pasteMsg + '</div>'
     47                                                        },
     48                                                        {
     49                                                                type : 'html',
     50                                                                id : 'content',
     51                                                                style : 'width:340px;height:170px',
     52                                                                html :
     53                                                                        '<textarea id="' + textareaId + '" style="' +
     54                                                                                'width:346px;' +
     55                                                                                'height:170px;' +
     56                                                                                'border:1px solid black;' +
     57                                                                                'background-color:white">' +
     58                                                                        '</textarea>'
     59                                                        }
     60                                                ]
     61                                        }
     62                                ]
     63                        }
     64                });
     65})();
  • _source/plugins/pastetext/plugin.js

     
     1/*
     2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
     3For licensing, see LICENSE.html or http://ckeditor.com/license
     4*/
     5
     6/**
     7 * @file Paste as plain text plugin
     8 */
     9
     10(function()
     11{
     12        // The pastetext command definition.
     13        var pasteTextCmd =
     14        {
     15                exec : function( editor )
     16                {
     17                        // We use getClipboardData just to test if the clipboard access has
     18                        // been granted by the user.
     19                        if ( CKEDITOR.getClipboardData() === false || !window.clipboardData )
     20                        {
     21                                editor.openDialog( 'pastetext' );
     22                                return;
     23                        }
     24
     25                        text = clipboardData.getData( 'Text' );
     26
     27                        editor.insertText( text );
     28                }
     29        };
     30
     31        // Register the plugin.
     32        CKEDITOR.plugins.add( 'pastetext',
     33        {
     34                init : function( editor, pluginPath )
     35                {
     36                        var commandName = 'pastetext',
     37                                command = editor.addCommand( commandName, pasteTextCmd );
     38
     39                        editor.ui.addButton( 'PasteText',
     40                                {
     41                                        label : editor.lang.pasteText.button,
     42                                        command : commandName
     43                                });
     44
     45                        CKEDITOR.dialog.add( commandName, CKEDITOR.getUrl( this.path + 'dialogs/pastetext.js' ) );
     46
     47                        if ( editor.config.forcePasteAsPlainText )
     48                        {
     49                                editor.on( 'beforePaste', function( event )
     50                                        {
     51                                                setTimeout( function() { command.exec() }, 0 );
     52                                                event.cancel();
     53                                        },
     54                                        null, null, 20 );
     55                        }
     56                },
     57                requires : [ 'clipboard' ]
     58        });
     59
     60        var clipboardDiv;
     61
     62        CKEDITOR.getClipboardData = function()
     63        {
     64                if ( !CKEDITOR.env.ie )
     65                        return false;
     66
     67                var doc = CKEDITOR.document,
     68                        body = doc.getBody();
     69
     70                if ( !clipboardDiv )
     71                {
     72                        clipboardDiv = doc.createElement( 'div',
     73                                {
     74                                        attributes :
     75                                                {
     76                                                        id: 'cke_hiddenDiv'
     77                                                },
     78                                        styles :
     79                                                {
     80                                                        position : 'absolute',
     81                                                        visibility : 'hidden',
     82                                                        overflow : 'hidden',
     83                                                        width : '1px',
     84                                                        height : '1px'
     85                                                }
     86                                });
     87
     88                        clipboardDiv.setHtml( '' );
     89
     90                        clipboardDiv.appendTo( body );
     91                }
     92
     93                // The "enabled" flag is used to check whether the paste operation has
     94                // been completed (the onpaste event has been fired).
     95                var     enabled = false;
     96                var setEnabled = function()
     97                {
     98                        enabled = true;
     99                };
     100
     101                body.on( 'paste', setEnabled );
     102
     103                // Create a text range and move it inside the div.
     104                var textRange = body.$.createTextRange();
     105                textRange.moveToElementText( clipboardDiv.$ );
     106
     107                // The execCommand in will fire the "onpaste", only if the
     108                // security settings are enabled.
     109                textRange.execCommand( 'Paste' );
     110
     111                // Get the DIV html and reset it.
     112                var html = clipboardDiv.getHtml();
     113                clipboardDiv.setHtml( '' );
     114
     115                body.removeListener( 'paste', setEnabled );
     116
     117                // Return the HTML or false if not enabled.
     118                return enabled && html;
     119        };     
     120})();
     121
     122CKEDITOR.editor.prototype.insertText = function( text )
     123{
     124        text = CKEDITOR.tools.htmlEncode( text );
     125
     126        // TODO: Replace the following with fill line break processing (see V2).
     127        text = text.replace( /(?:\r\n)|\n|\r/g, '<br>' );
     128
     129        this.insertHtml( text );
     130};
     131
     132CKEDITOR.config.forcePasteAsPlainText = false;
  • _source/plugins/toolbar/plugin.js

     
    208208        [
    209209                'Source', '-',
    210210                'NewPage', 'Preview', 'Print', '-',
     211                'Cut', 'Copy', 'Paste', 'PasteText', '-',
    211212                'Bold', 'Italic', 'Underline', 'Strike', '-',
    212213                'NumberedList', 'BulletedList', '-',
    213214                'Outdent', 'Indent', 'Blockquote', '-',
  • _source/skins/default/toolbar.css

     
    156156        background-position: 0 -64px;
    157157}
    158158
     159.cke_skin_default a.cke_button_cut .cke_icon
     160{
     161        background-position: 0 -96px;
     162}
     163
     164.cke_skin_default a.cke_button_copy .cke_icon
     165{
     166        background-position: 0 -112px;
     167}
     168
     169.cke_skin_default a.cke_button_paste .cke_icon
     170{
     171        background-position: 0 -128px;
     172}
     173
     174.cke_skin_default a.cke_button_pastetext .cke_icon
     175{
     176        background-position: 0 -144px;
     177}
     178
    159179.cke_skin_default a.cke_button_find .cke_icon
    160180{
    161181        background-position: 0 -240px;
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy