JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.2.2
[ckeditor.git] / _source / plugins / clipboard / dialogs / paste.js
1 /*\r
2 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 CKEDITOR.dialog.add( 'paste', function( editor )\r
7 {\r
8         var lang = editor.lang.clipboard;\r
9         var isCustomDomain = CKEDITOR.env.isCustomDomain();\r
10 \r
11         function onPasteFrameLoad( win )\r
12         {\r
13                 var doc =  new CKEDITOR.dom.document( win.document ),\r
14                         docElement = doc.$;\r
15 \r
16                 doc.getById( "cke_actscrpt" ).remove();\r
17 \r
18                 CKEDITOR.env.ie ?\r
19                         docElement.body.contentEditable = "true" :\r
20                         docElement.designMode = "on";\r
21 \r
22                 // IE before version 8 will leave cursor blinking inside the document after\r
23                 // editor blurred unless we clean up the selection. (#4716)\r
24                 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 )\r
25                 {\r
26                         doc.getWindow().on( 'blur', function()\r
27                         {\r
28                                 docElement.selection.empty();\r
29                         } );\r
30                 }\r
31 \r
32                 doc.on( "keydown", function( e )\r
33                 {\r
34                         var domEvent = e.data,\r
35                                 key = domEvent.getKeystroke(),\r
36                                 processed;\r
37 \r
38                         switch( key )\r
39                         {\r
40                                 case 27 :\r
41                                         this.hide();\r
42                                         processed = 1;\r
43                                         break;\r
44 \r
45                                 case 9 :\r
46                                 case CKEDITOR.SHIFT + 9 :\r
47                                         this.changeFocus( true );\r
48                                         processed = 1;\r
49                         }\r
50 \r
51                         processed && domEvent.preventDefault();\r
52                 }, this );\r
53 \r
54                 editor.fire( 'ariaWidget', new CKEDITOR.dom.element( win.frameElement ) );\r
55         }\r
56 \r
57         return {\r
58                 title : lang.title,\r
59 \r
60                 minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,\r
61                 minHeight : CKEDITOR.env.quirks ? 250 : 245,\r
62                 onShow : function()\r
63                 {\r
64                         // FIREFOX BUG: Force the browser to render the dialog to make the to-be-\r
65                         // inserted iframe editable. (#3366)\r
66                         this.parts.dialog.$.offsetHeight;\r
67 \r
68                         var htmlToLoad =\r
69                                 '<html dir="' + editor.config.contentsLangDirection + '"' +\r
70                                 ' lang="' + ( editor.config.contentsLanguage || editor.langCode ) + '">' +\r
71                                         '<head><style>body { margin: 3px; height: 95%; } </style></head><body>' +\r
72                                         '<script id="cke_actscrpt" type="text/javascript">' +\r
73                                         'window.parent.CKEDITOR.tools.callFunction( ' + CKEDITOR.tools.addFunction( onPasteFrameLoad, this ) + ', this );' +\r
74                                         '</script></body>' +\r
75                                 '</html>';\r
76 \r
77                         var iframe = CKEDITOR.dom.element.createFromHtml(\r
78                                                 '<iframe' +\r
79                                                 ' frameborder="0" ' +\r
80                                                 ' allowTransparency="true"' +\r
81                                                 // Support for custom document.domain in IE.\r
82                                                 ( isCustomDomain ?\r
83                                                         ' src="javascript:void((function(){' +\r
84                                                                 'document.open();' +\r
85                                                                 'document.domain=\'' + document.domain + '\';' +\r
86                                                                 'document.close();' +\r
87                                                         '})())"' : '' ) +\r
88                                                 ' role="region"' +\r
89                                                 ' aria-label="' + lang.pasteArea + '"' +\r
90                                                 ' aria-describedby="' + this.getContentElement( 'general', 'pasteMsg' ).domId + '"' +\r
91                                                 ' aria-multiple="true"' +\r
92                                                 '></iframe>' );\r
93 \r
94                         iframe.on( 'load', function( e )\r
95                         {\r
96                                 e.removeListener();\r
97                                 var doc = iframe.getFrameDocument().$;\r
98                                 // Custom domain handling is needed after each document.open().\r
99                                 doc.open();\r
100                                 if ( isCustomDomain )\r
101                                         doc.domain = document.domain;\r
102                                 doc.write( htmlToLoad );\r
103                                 doc.close();\r
104                         }, this );\r
105 \r
106                         iframe.setStyles(\r
107                                 {\r
108                                         width : '346px',\r
109                                         height : '130px',\r
110                                         'background-color' : 'white',\r
111                                         border : '1px solid black'\r
112                                 } );\r
113                         iframe.setCustomData( 'dialog', this );\r
114 \r
115                         var field = this.getContentElement( 'general', 'editing_area' ),\r
116                                 container = field.getElement();\r
117                         container.setHtml( '' );\r
118                         container.append( iframe );\r
119 \r
120                         // IE need a redirect on focus to make\r
121                         // the cursor blinking inside iframe. (#5461)\r
122                         if ( CKEDITOR.env.ie )\r
123                         {\r
124                                 var focusGrabber = CKEDITOR.dom.element.createFromHtml( '<span tabindex="-1" style="position:absolute;" role="presentation"></span>' );\r
125                                 focusGrabber.on( 'focus', function()\r
126                                 {\r
127                                         iframe.$.contentWindow.focus();\r
128                                 });\r
129                                 container.append( focusGrabber );\r
130 \r
131                                 // Override focus handler on field.\r
132                                 field.focus = function()\r
133                                 {\r
134                                         focusGrabber.focus();\r
135                                         this.fire( 'focus' );\r
136                                 };\r
137                         }\r
138 \r
139                         field.getInputElement = function(){ return iframe; };\r
140 \r
141                         // Force container to scale in IE.\r
142                         if ( CKEDITOR.env.ie )\r
143                         {\r
144                                 container.setStyle( 'display', 'block' );\r
145                                 container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );\r
146                         }\r
147                 },\r
148 \r
149                 onHide : function()\r
150                 {\r
151                         if ( CKEDITOR.env.ie )\r
152                                 this.getParentEditor().document.getBody().$.contentEditable = 'true';\r
153                 },\r
154 \r
155                 onLoad : function()\r
156                 {\r
157                         if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' )\r
158                                 this.parts.contents.setStyle( 'overflow', 'hidden' );\r
159                 },\r
160 \r
161                 onOk : function()\r
162                 {\r
163                         var container = this.getContentElement( 'general', 'editing_area' ).getElement(),\r
164                                 iframe = container.getElementsByTag( 'iframe' ).getItem( 0 ),\r
165                                 editor = this.getParentEditor(),\r
166                                 html = iframe.$.contentWindow.document.body.innerHTML;\r
167 \r
168                         setTimeout( function(){\r
169                                 editor.fire( 'paste', { 'html' : html } );\r
170                         }, 0 );\r
171 \r
172                 },\r
173 \r
174                 contents : [\r
175                         {\r
176                                 id : 'general',\r
177                                 label : editor.lang.common.generalTab,\r
178                                 elements : [\r
179                                         {\r
180                                                 type : 'html',\r
181                                                 id : 'securityMsg',\r
182                                                 html : '<div style="white-space:normal;width:340px;">' + lang.securityMsg + '</div>'\r
183                                         },\r
184                                         {\r
185                                                 type : 'html',\r
186                                                 id : 'pasteMsg',\r
187                                                 html : '<div style="white-space:normal;width:340px;">'+lang.pasteMsg +'</div>'\r
188                                         },\r
189                                         {\r
190                                                 type : 'html',\r
191                                                 id : 'editing_area',\r
192                                                 style : 'width: 100%; height: 100%;',\r
193                                                 html : '',\r
194                                                 focus : function()\r
195                                                 {\r
196                                                         var win = this.getInputElement().$.contentWindow;\r
197 \r
198                                                         // #3291 : JAWS needs the 500ms delay to detect that the editor iframe\r
199                                                         // iframe is no longer editable. So that it will put the focus into the\r
200                                                         // Paste from Word dialog's editable area instead.\r
201                                                         setTimeout( function()\r
202                                                         {\r
203                                                                 win.focus();\r
204                                                         }, 500 );\r
205                                                 }\r
206                                         }\r
207                                 ]\r
208                         }\r
209                 ]\r
210         };\r
211 });\r