summaryrefslogtreecommitdiff
path: root/_source/plugins/clipboard/plugin.js
diff options
context:
space:
mode:
Diffstat (limited to '_source/plugins/clipboard/plugin.js')
-rw-r--r--_source/plugins/clipboard/plugin.js208
1 files changed, 208 insertions, 0 deletions
diff --git a/_source/plugins/clipboard/plugin.js b/_source/plugins/clipboard/plugin.js
new file mode 100644
index 0000000..c1f67b1
--- /dev/null
+++ b/_source/plugins/clipboard/plugin.js
@@ -0,0 +1,208 @@
+/*
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+/**
+ * @file Clipboard support
+ */
+
+(function()
+{
+ // Tries to execute any of the paste, cut or copy commands in IE. Returns a
+ // boolean indicating that the operation succeeded.
+ var execIECommand = function( editor, command )
+ {
+ var doc = editor.document,
+ body = doc.getBody();
+
+ var enabled = false;
+ var onExec = function()
+ {
+ enabled = true;
+ };
+
+ // The following seems to be the only reliable way to detect that
+ // clipboard commands are enabled in IE. It will fire the
+ // onpaste/oncut/oncopy events only if the security settings allowed
+ // the command to execute.
+ body.on( command, onExec );
+
+ doc.$.execCommand( command );
+
+ body.removeListener( command, onExec );
+
+ return enabled;
+ };
+
+ // Attempts to execute the Cut and Copy operations.
+ var tryToCutCopy =
+ CKEDITOR.env.ie ?
+ function( editor, type )
+ {
+ return execIECommand( editor, type );
+ }
+ : // !IE.
+ function( editor, type )
+ {
+ try
+ {
+ // Other browsers throw an error if the command is disabled.
+ return editor.document.$.execCommand( type );
+ }
+ catch( e )
+ {
+ return false;
+ }
+ };
+
+ // A class that represents one of the cut or copy commands.
+ var cutCopyCmd = function( type )
+ {
+ this.type = type;
+ this.canUndo = ( this.type == 'cut' ); // We can't undo copy to clipboard.
+ };
+
+ cutCopyCmd.prototype =
+ {
+ exec : function( editor, data )
+ {
+ var success = tryToCutCopy( editor, this.type );
+
+ if ( !success )
+ alert( editor.lang.clipboard[ this.type + 'Error' ] ); // Show cutError or copyError.
+
+ return success;
+ }
+ };
+
+ // Paste command.
+ var pasteCmd =
+ CKEDITOR.env.ie ?
+ {
+ exec : function( editor, data )
+ {
+ // Prevent IE from pasting at the begining of the document.
+ editor.focus();
+
+ if ( !editor.fire( 'beforePaste' )
+ && !execIECommand( editor, 'paste' ) )
+ {
+ editor.openDialog( 'paste' );
+ }
+ }
+ }
+ :
+ {
+ exec : function( editor )
+ {
+ try
+ {
+ if ( !editor.fire( 'beforePaste' )
+ && !editor.document.$.execCommand( 'Paste', false, null ) )
+ {
+ throw 0;
+ }
+ }
+ catch ( e )
+ {
+ // Open the paste dialog.
+ editor.openDialog( 'paste' );
+ }
+ }
+ };
+
+ // Listens for some clipboard related keystrokes, so they get customized.
+ var onKey = function( event )
+ {
+ switch ( event.data.keyCode )
+ {
+ // Paste
+ case CKEDITOR.CTRL + 86 : // CTRL+V
+ case CKEDITOR.SHIFT + 45 : // SHIFT+INS
+
+ var editor = this;
+ editor.fire( 'saveSnapshot' ); // Save before paste
+
+ if ( editor.fire( 'beforePaste' ) )
+ event.cancel();
+
+ setTimeout( function()
+ {
+ editor.fire( 'saveSnapshot' ); // Save after paste
+ }, 0 );
+ return;
+
+ // Cut
+ case CKEDITOR.CTRL + 88 : // CTRL+X
+ case CKEDITOR.SHIFT + 46 : // SHIFT+DEL
+
+ // Save Undo snapshot.
+ editor = this;
+ editor.fire( 'saveSnapshot' ); // Save before paste
+ setTimeout( function()
+ {
+ editor.fire( 'saveSnapshot' ); // Save after paste
+ }, 0 );
+ }
+ };
+
+ // Register the plugin.
+ CKEDITOR.plugins.add( 'clipboard',
+ {
+ init : function( editor )
+ {
+ function addButtonCommand( buttonName, commandName, command, ctxMenuOrder )
+ {
+ var lang = editor.lang[ commandName ];
+
+ editor.addCommand( commandName, command );
+ editor.ui.addButton( buttonName,
+ {
+ label : lang,
+ command : commandName
+ });
+
+ // If the "menu" plugin is loaded, register the menu item.
+ if ( editor.addMenuItems )
+ {
+ editor.addMenuItem( commandName,
+ {
+ label : lang,
+ command : commandName,
+ group : 'clipboard',
+ order : ctxMenuOrder
+ });
+ }
+ }
+
+ addButtonCommand( 'Cut', 'cut', new cutCopyCmd( 'cut' ), 1 );
+ addButtonCommand( 'Copy', 'copy', new cutCopyCmd( 'copy' ), 4 );
+ addButtonCommand( 'Paste', 'paste', pasteCmd, 8 );
+
+ CKEDITOR.dialog.add( 'paste', CKEDITOR.getUrl( this.path + 'dialogs/paste.js' ) );
+
+ editor.on( 'key', onKey, editor );
+
+ // If the "contextmenu" plugin is loaded, register the listeners.
+ if ( editor.contextMenu )
+ {
+ function stateFromNamedCommand( command )
+ {
+ return editor.document.$.queryCommandEnabled( command ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
+ }
+
+ editor.contextMenu.addListener( function()
+ {
+ return {
+ cut : stateFromNamedCommand( 'Cut' ),
+
+ // Browser bug: 'Cut' has the correct states for both Copy and Cut.
+ copy : stateFromNamedCommand( 'Cut' ),
+ paste : CKEDITOR.env.webkit ? CKEDITOR.TRISTATE_OFF : stateFromNamedCommand( 'Paste' )
+ };
+ });
+ }
+ }
+ });
+})();