Ticket #1376: 1376_6.patch
File 1376_6.patch, 25.9 KB (added by , 13 years ago) |
---|
-
_source/plugins/showblocks/plugin.js
89 89 90 90 var commandDefinition = 91 91 { 92 readOnly : 1, 92 93 preserveState : true, 93 94 editorFocus : false, 94 95 -
_samples/readonly.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <!-- 3 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. 4 For licensing, see LICENSE.html or http://ckeditor.com/license 5 --> 6 <html xmlns="http://www.w3.org/1999/xhtml"> 7 <head> 8 <title>Read-only — CKEditor Sample</title> 9 <meta content="text/html; charset=utf-8" http-equiv="content-type" /> 10 <!-- CKReleaser %REMOVE_LINE% 11 <script type="text/javascript" src="../ckeditor.js"></script> 12 CKReleaser %REMOVE_START% --> 13 <script type="text/javascript" src="../ckeditor_source.js"></script> 14 <!-- CKReleaser %REMOVE_END% --> 15 <script src="sample.js" type="text/javascript"></script> 16 <link href="sample.css" rel="stylesheet" type="text/css" /> 17 <script type="text/javascript"> 18 //<![CDATA[ 19 20 // The instanceReady event is fired, when an instance of CKEditor has finished 21 // its initialization. 22 CKEDITOR.on( 'instanceReady', function( ev ) 23 { 24 // Show the editor name and description in the browser status bar. 25 document.getElementById( 'eMessage' ).innerHTML = '<p>Instance <code>' + ev.editor.name + '<\/code> loaded.<\/p>'; 26 27 // Show this sample buttons. 28 document.getElementById( 'eButtons' ).style.display = 'block'; 29 }); 30 31 function toggleReadOnly( isReadOnly ) 32 { 33 // Get the editor instance that we want to interact with. 34 var oEditor = CKEDITOR.instances.editor1; 35 36 // Change the read-only state of editor. 37 // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.editor.html#setReadOnly 38 oEditor.setReadOnly( isReadOnly ); 39 } 40 41 //]]> 42 </script> 43 44 </head> 45 <body> 46 <h1 class="samples"> 47 CKEditor Sample — Using CKEditor ReadOnly API 48 </h1> 49 <div class="description"> 50 <p> 51 This sample shows how to use the 52 <a class="samples" href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.editor.html#setReadOnly">set read-only</a> 53 API to put editor into an immutable state. 54 </p> 55 <p> 56 For details on how to create this setup check the source code of this sample page. 57 </p> 58 </div> 59 60 <!-- This <div> holds alert messages to be display in the sample page. --> 61 <div id="alerts"> 62 <noscript> 63 <p> 64 <strong>CKEditor requires JavaScript to run</strong>. In a browser with no JavaScript 65 support, like yours, you should still see the contents (HTML data) and you should 66 be able to edit it normally, without a rich editor interface. 67 </p> 68 </noscript> 69 </div> 70 <form action="sample_posteddata.php" method="post"> 71 <textarea class="ckeditor" id="editor1" name="editor1" cols="100" rows="10"><p>This is some <strong>sample text</strong>. You are using <a href="http://ckeditor.com/">CKEditor</a>.some</p></textarea> 72 <div id="eMessage"> 73 </div> 74 <div id="eButtons" style="display: none"> 75 <input onclick="toggleReadOnly( true );" type="button" value="Turn on read-only" /> 76 <input onclick="toggleReadOnly();" type="button" value="Turn off read-only" /> 77 </div> 78 </form> 79 <div id="footer"> 80 <hr /> 81 <p> 82 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a> 83 </p> 84 <p id="copy"> 85 Copyright © 2003-2011, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico 86 Knabben. All rights reserved. 87 </p> 88 </div> 89 </body> 90 </html> -
_source/plugins/about/plugin.js
11 11 var command = editor.addCommand( 'about', new CKEDITOR.dialogCommand( 'about' ) ); 12 12 command.modes = { wysiwyg:1, source:1 }; 13 13 command.canUndo = false; 14 command.readOnly = 1; 14 15 15 16 editor.ui.addButton( 'About', 16 17 { -
_source/plugins/save/plugin.js
12 12 var saveCmd = 13 13 { 14 14 modes : { wysiwyg:1, source:1 }, 15 readOnly : 1, 15 16 16 17 exec : function( editor ) 17 18 { -
_source/plugins/showborders/plugin.js
40 40 { 41 41 preserveState : true, 42 42 editorFocus : false, 43 readOnly: 1, 43 44 44 45 exec : function ( editor ) 45 46 { -
_source/plugins/basicstyles/plugin.js
17 17 18 18 editor.attachStyleStateChange( style, function( state ) 19 19 { 20 editor.getCommand( commandName ).setState( state );20 !editor.readOnly && editor.getCommand( commandName ).setState( state ); 21 21 }); 22 22 23 23 editor.addCommand( commandName, new CKEDITOR.styleCommand( style ) ); -
_source/plugins/editingblock/plugin.js
113 113 }, 0 ); 114 114 }); 115 115 116 // Force reload the mode to refresh all command states. 117 editor.on( 'readOnly', function() { 118 this.setMode( this.mode || this.config.startupMode, 1 ); 119 }); 120 116 121 editor.on( 'destroy', function () 117 122 { 118 123 // -> currentMode.unload( holderElement ); … … 151 156 * // Switch to "source" view. 152 157 * CKEDITOR.instances.editor1.setMode( 'source' ); 153 158 */ 154 CKEDITOR.editor.prototype.setMode = function( mode )159 CKEDITOR.editor.prototype.setMode = function( mode, forceReload ) 155 160 { 156 161 this.fire( 'beforeSetMode', { newMode : mode } ); 157 162 … … 162 167 // Unload the previous mode. 163 168 if ( this.mode ) 164 169 { 165 if ( mode == this.mode )170 if ( !forceReload && mode == this.mode ) 166 171 return; 167 172 168 173 this.fire( 'beforeModeUnload' ); -
_source/plugins/justify/plugin.js
49 49 50 50 function onSelectionChange( evt ) 51 51 { 52 if ( evt.editor.readOnly ) 53 return; 54 52 55 var command = evt.editor.getCommand( this.name ); 53 56 command.state = getState.call( this, evt.editor, evt.data.path ); 54 57 command.fire( 'state' ); -
_source/core/dom/range.js
1870 1870 return 0; 1871 1871 } 1872 1872 // Range enclosed entirely in an editable element. 1873 else if ( node.is( ' body' )1873 else if ( node.is( 'html' ) 1874 1874 || node.getAttribute( 'contentEditable' ) == 'true' 1875 1875 && ( node.contains( anotherEnd ) || node.equals( anotherEnd ) ) ) 1876 1876 { -
_source/plugins/selection/plugin.js
92 92 var selectAllCmd = 93 93 { 94 94 modes : { wysiwyg : 1, source : 1 }, 95 readOnly : CKEDITOR.env.ie || CKEDITOR.env.webkit, 95 96 exec : function( editor ) 96 97 { 97 98 switch ( editor.mode ) -
_source/plugins/find/plugin.js
15 15 }); 16 16 var findCommand = editor.addCommand( 'find', new CKEDITOR.dialogCommand( 'find' ) ); 17 17 findCommand.canUndo = false; 18 findCommand.readOnly = 1; 18 19 19 20 editor.ui.addButton( 'Replace', 20 21 { -
_source/plugins/find/dialogs/find.js
854 854 finder.searchRange = getSearchRange(); 855 855 856 856 this.selectPage( startupPage ); 857 858 if ( startupPage == 'find' && this._.editor.readOnly ) 859 this.hidePage('replace' ); 857 860 }, 858 861 onHide : function() 859 862 { -
_source/plugins/menu/plugin.js
97 97 { 98 98 var item = this.editor.getMenuItem( itemName ); 99 99 100 if ( item )100 if ( item && ( !item.command || this.editor.getCommand( item.command ).state ) ) 101 101 { 102 item.state = listenerItems[ itemName ];102 item.state = listenerItems[ itemName ]; 103 103 this.add( item ); 104 104 } 105 105 } -
_source/plugins/elementspath/plugin.js
15 15 toolbarFocus : 16 16 { 17 17 editorFocus : false, 18 readOnly : 1, 18 19 exec : function( editor ) 19 20 { 20 21 var idBase = editor._.elementsPath.idBase; -
_source/plugins/a11yhelp/plugin.js
37 37 }); 38 38 }, 39 39 modes : { wysiwyg:1, source:1 }, 40 readOnly : 1, 40 41 canUndo : false 41 42 }); 42 43 -
_source/core/editor.js
160 160 */ 161 161 editor.tabIndex = editor.config.tabIndex || editor.element.getAttribute( 'tabindex' ) || 0; 162 162 163 /** 164 * Immutable field indicate the read-only state of this editor. 165 * @name CKEDITOR.editor.prototype.readOnly 166 * @see CKEDITOR.editor.prototype.setReadOnly 167 * @type Boolean 168 * @default CKEDITOR.config.readOnly 169 * @since 3.6 170 */ 171 editor.readOnly = !!( editor.config.readOnly || editor.element.getAttribute( 'disabled' ) ); 172 163 173 // Fire the "configLoaded" event. 164 174 editor.fireOnce( 'configLoaded' ); 165 175 … … 394 404 } 395 405 }; 396 406 397 function updateCommands Mode()407 function updateCommands() 398 408 { 399 409 var command, 400 410 commands = this._.commands, … … 403 413 for ( var name in commands ) 404 414 { 405 415 command = commands[ name ]; 406 command[ command.startDisabled ? 'disable' : command.modes[ mode ] ? 'enable' : 'disable' ](); 416 command[ command.startDisabled ? 'disable' : 417 this.readOnly && !command.readOnly ? 'disable' : command.modes[ mode ] ? 'enable' : 'disable' ](); 407 418 } 408 419 } 409 420 … … 491 502 492 503 CKEDITOR.fire( 'instanceCreated', null, this ); 493 504 494 this.on( 'mode', updateCommands Mode, null, null, 1 );505 this.on( 'mode', updateCommands, null, null, 1 ); 495 506 496 507 initConfig( this, instanceConfig ); 497 508 }; … … 714 725 }, 715 726 716 727 /** 728 * Turn editor into read-only mode or restore it from read-only mode. 729 * @param enable {Boolean} 730 * @since 3.6 731 * <strong>Note:</strong> current editing block will be reloaded. 732 */ 733 setReadOnly : function( enable ) 734 { 735 if ( this.readOnly != enable ) 736 { 737 this.readOnly = !!enable; 738 // Reload current mode, then fire the event on editor. 739 this.fire( 'readOnly' ); 740 } 741 }, 742 743 /** 717 744 * Inserts HTML into the currently selected position in the editor. 718 745 * @param {String} data HTML code to be inserted into the editor. 719 746 * @example … … 841 868 */ 842 869 843 870 /** 871 * Whether to start the editor in read-only mode, otherwise it depends on if "disabled" attribute is presented on the host <textarea>. 872 * @name CKEDITOR.config.readOnly 873 * @see CKEDITOR.editor.setReadOnly 874 * @type Boolean 875 * @default false 876 * @since 3.6 877 * @example 878 * config.readOnly = true; 879 */ 880 881 /** 844 882 * Fired when a CKEDITOR instance is created, but still before initializing it. 845 883 * To interact with a fully initialized instance, use the 846 884 * {@link CKEDITOR#instanceReady} event instead. … … 983 1021 * @param {CKEDITOR.editor} editor This editor instance. 984 1022 * @param {Object} element The element to insert. 985 1023 */ 1024 1025 /** 1026 * Event fired once editor's {@link CKEDITOR.editor.prototype.readOnly} state has changed. 1027 * @name CKEDITOR.editor#readOnly 1028 * @event 1029 * @param {CKEDITOR.editor} editor This editor instance. 1030 */ -
_source/plugins/toolbar/plugin.js
36 36 toolbarFocus : 37 37 { 38 38 modes : { wysiwyg : 1, source : 1 }, 39 readOnly : 1, 39 40 40 41 exec : function( editor ) 41 42 { … … 294 295 295 296 editor.addCommand( 'toolbarCollapse', 296 297 { 298 readOnly : 1, 297 299 exec : function( editor ) 298 300 { 299 301 var collapser = CKEDITOR.document.getById( collapserId ), -
_source/plugins/print/plugin.js
37 37 editor.document.$.execCommand( "Print" ); 38 38 }, 39 39 canUndo : false, 40 readOnly : 1, 40 41 modes : { wysiwyg : !( CKEDITOR.env.opera ) } // It is imposible to print the inner document in Opera. 41 42 }; -
_source/plugins/richcombo/plugin.js
130 130 131 131 editor.on( 'mode', function() 132 132 { 133 this.setState( this.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); 133 var state = this.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED; 134 this.setState( editor.readOnly && !this.readOnly ? CKEDITOR.TRISTATE_DISABLED : state ); 134 135 this.setValue( '' ); 135 136 }, 136 137 this ); -
_source/plugins/button/plugin.js
149 149 editor.on( 'mode', function() 150 150 { 151 151 var mode = editor.mode; 152 152 153 // Restore saved button state. 153 this.setState( this.modes[ mode ] ? 154 modeStates[ mode ] != undefined ? modeStates[ mode ] : 155 CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED ); 154 var state = this.modes[ mode ] ? modeStates[ mode ] != undefined ? modeStates[ mode ] : 155 CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED; 156 157 this.setState( editor.readOnly && !this.readOnly ? CKEDITOR.TRISTATE_DISABLED : state ); 156 158 }, this); 157 159 } 158 160 else if ( command ) -
_source/plugins/sourcearea/plugin.js
41 41 textarea.addClass( 'cke_source' ); 42 42 textarea.addClass( 'cke_enable_context_menu' ); 43 43 44 editor.readOnly && textarea.setAttribute( 'disabled', true ); 45 44 46 var styles = 45 47 { 46 48 // IE7 has overflow the <textarea> from wrapping table cell. … … 181 183 { 182 184 modes : { wysiwyg:1, source:1 }, 183 185 editorFocus : false, 184 186 readOnly : 1, 185 187 exec : function( editor ) 186 188 { 187 189 if ( editor.mode == 'wysiwyg' ) -
_source/plugins/clipboard/plugin.js
293 293 // keyboard paste or execCommand ) (#4874). 294 294 CKEDITOR.env.ie && ( depressBeforeEvent = 1 ); 295 295 296 var retval = editor.document.$.queryCommandEnabled( command ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED; 296 var retval = CKEDITOR.TRISTATE_OFF; 297 try { retval = editor.document.$.queryCommandEnabled( command ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED; }catch( er ){} 298 297 299 depressBeforeEvent = 0; 298 300 return retval; 299 301 } -
_source/plugins/undo/plugin.js
90 90 // Make the undo manager available only in wysiwyg mode. 91 91 editor.on( 'mode', function() 92 92 { 93 undoManager.enabled = editor. mode == 'wysiwyg';93 undoManager.enabled = editor.readOnly ? false : editor.mode == 'wysiwyg'; 94 94 undoManager.onChange(); 95 95 }); 96 96 -
_source/plugins/link/plugin.js
54 54 // Register selection change handler for the unlink button. 55 55 editor.on( 'selectionChange', function( evt ) 56 56 { 57 if ( editor.readOnly ) 58 return; 59 57 60 /* 58 61 * Despite our initial hope, document.queryCommandEnabled() does not work 59 62 * for this in Firefox. So we must detect the state by element paths. -
_source/plugins/enterkey/plugin.js
11 11 12 12 init : function( editor ) 13 13 { 14 var specialKeys = editor.specialKeys; 15 specialKeys[ 13 ] = enter; 16 specialKeys[ CKEDITOR.SHIFT + 13 ] = shiftEnter; 14 editor.addCommand( 'enter', { 15 modes : { wysiwyg:1 }, 16 editorFocus : false, 17 exec : enter 18 }); 19 20 editor.addCommand( 'shiftEnter', { 21 modes : { wysiwyg:1 }, 22 editorFocus : false, 23 exec : shiftEnter 24 }); 25 26 var keystrokes = editor.keystrokeHandler.keystrokes; 27 keystrokes[ 13 ] = 'enter'; 28 keystrokes[ CKEDITOR.SHIFT + 13 ] = 'shiftEnter'; 17 29 } 18 30 }); 19 31 -
_source/plugins/preview/plugin.js
13 13 { 14 14 modes : { wysiwyg:1, source:1 }, 15 15 canUndo : false, 16 readOnly : 1, 16 17 exec : function( editor ) 17 18 { 18 19 var sHTML, -
_source/plugins/list/plugin.js
218 218 219 219 function onSelectionChange( evt ) 220 220 { 221 if ( evt.editor.readOnly ) 222 return; 223 221 224 var path = evt.data.path, 222 225 blockLimit = path.blockLimit, 223 226 elements = path.elements, -
_source/plugins/blockquote/plugin.js
25 25 26 26 function onSelectionChange( evt ) 27 27 { 28 var editor = evt.editor, 29 command = editor.getCommand( 'blockquote' ); 28 var editor = evt.editor; 29 if ( editor.readOnly ) 30 return; 31 32 var command = editor.getCommand( 'blockquote' ); 30 33 command.state = getState( editor, evt.data.path ); 31 34 command.fire( 'state' ); 32 35 } -
_source/plugins/wysiwygarea/plugin.js
598 598 599 599 body.spellcheck = !editor.config.disableNativeSpellChecker; 600 600 601 var editable = !editor.readOnly; 602 601 603 if ( CKEDITOR.env.ie ) 602 604 { 603 605 // Don't display the focus border. … … 606 608 // Disable and re-enable the body to avoid IE from 607 609 // taking the editing focus at startup. (#141 / #523) 608 610 body.disabled = true; 609 body.contentEditable = true;611 body.contentEditable = editable; 610 612 body.removeAttribute( 'disabled' ); 611 613 } 612 614 else … … 618 620 // Prefer 'contentEditable' instead of 'designMode'. (#3593) 619 621 if ( CKEDITOR.env.gecko && CKEDITOR.env.version >= 10900 620 622 || CKEDITOR.env.opera ) 621 domDocument.$.body.contentEditable = true;623 domDocument.$.body.contentEditable = editable; 622 624 else if ( CKEDITOR.env.webkit ) 623 domDocument.$.body.parentNode.contentEditable = true;625 domDocument.$.body.parentNode.contentEditable = editable; 624 626 else 625 domDocument.$.designMode = 'on';627 domDocument.$.designMode = editable? 'off' : 'on'; 626 628 }, 0 ); 627 629 } 628 630 629 CKEDITOR.env.gecko && CKEDITOR.tools.setTimeout( activateEditing, 0, null, editor );631 editable && CKEDITOR.env.gecko && CKEDITOR.tools.setTimeout( activateEditing, 0, null, editor ); 630 632 631 633 domWindow = editor.window = new CKEDITOR.dom.window( domWindow ); 632 634 domDocument = editor.document = new CKEDITOR.dom.document( domDocument ); 633 635 634 domDocument.on( 'dblclick', function( evt )636 editable && domDocument.on( 'dblclick', function( evt ) 635 637 { 636 638 var element = evt.data.getTarget(), 637 639 data = { element : element, dialog : '' }; … … 712 714 713 715 // IE standard compliant in editing frame doesn't focus the editor when 714 716 // clicking outside actual content, manually apply the focus. (#1659) 715 if ( CKEDITOR.env.ie716 && domDocument.$.compatMode == 'CSS1Compat'717 if ( editable && 718 CKEDITOR.env.ie && domDocument.$.compatMode == 'CSS1Compat' 717 719 || CKEDITOR.env.gecko 718 720 || CKEDITOR.env.opera ) 719 721 { … … 744 746 { 745 747 var doc = editor.document; 746 748 747 if ( CKEDITOR.env.gecko && CKEDITOR.env.version >= 10900 )749 if ( editable && CKEDITOR.env.gecko && CKEDITOR.env.version >= 10900 ) 748 750 blinkCursor(); 749 751 else if ( CKEDITOR.env.opera ) 750 752 doc.getBody().focus(); … … 762 764 }); 763 765 764 766 var keystrokeHandler = editor.keystrokeHandler; 765 if ( keystrokeHandler ) 766 keystrokeHandler.attach( domDocument ); 767 // Prevent backspace from navigating off the page. 768 !editable && ( keystrokeHandler.blockedKeystrokes[ 8 ] = 1 ); 769 keystrokeHandler.attach( domDocument ); 767 770 768 771 if ( CKEDITOR.env.ie ) 769 772 { 770 773 domDocument.getDocumentElement().addClass( domDocument.$.compatMode ); 771 774 // Override keystrokes which should have deletion behavior 772 775 // on control types in IE . (#4047) 773 domDocument.on( 'keydown', function( evt )776 editable && domDocument.on( 'keydown', function( evt ) 774 777 { 775 778 var keyCode = evt.data.getKeystroke(); 776 779 -
_source/plugins/bidi/plugin.js
22 22 { 23 23 var editor = evt.editor, 24 24 path = evt.data.path; 25 26 if ( editor.readOnly ) 27 return; 28 25 29 var useComputedState = editor.config.useComputedState, 26 30 selectedElement; 27 31 -
_samples/index.html
79 79 <li><a class="samples" href="output_for_flash.html">Output for Flash</a><br /> 80 80 Configuring CKEditor to produce HTML code that can be used with Adobe Flash. 81 81 </li> 82 <li><a class="samples" href="readonly.html">ReadOnly mode</a><br /> 83 Using the readOnly API to disallow making any change to the editor content. 84 </li> 82 85 <li><a class="samples" href="placeholder.html">Placeholder plugin</a><br /> 83 86 Using the Placeholder plugin to create uneditable sections that can only be created and modified with a proper dialog window. 84 87 </li> -
_source/plugins/maximize/plugin.js
85 85 for ( var i in all ) 86 86 { 87 87 var one = all[ i ]; 88 if ( one.mode == 'wysiwyg' )88 if ( one.mode == 'wysiwyg' && !one.readOnly ) 89 89 { 90 90 var body = one.document.getBody(); 91 91 // Refresh 'contentEditable' otherwise … … 155 155 editor.addCommand( 'maximize', 156 156 { 157 157 modes : { wysiwyg : 1, source : 1 }, 158 readOnly : 1, 158 159 editorFocus : false, 159 160 exec : function() 160 161 { -
_source/plugins/indent/plugin.js
15 15 16 16 function onSelectionChange( evt ) 17 17 { 18 if ( evt.editor.readOnly ) 19 return; 20 18 21 var editor = evt.editor, 19 22 elementPath = evt.data.path, 20 23 list = elementPath && elementPath.contains( listNodeNames ),