[239] | 1 | /*
|
---|
| 2 | Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
|
---|
| 3 | For licensing, see LICENSE.html or http://ckeditor.com/license
|
---|
| 4 | */
|
---|
| 5 |
|
---|
| 6 | (function()
|
---|
| 7 | {
|
---|
| 8 | var doc = CKEDITOR.document;
|
---|
| 9 |
|
---|
| 10 | CKEDITOR.dialog.add( 'templates', function( editor )
|
---|
| 11 | {
|
---|
| 12 | // Constructs the HTML view of the specified templates data.
|
---|
| 13 | function renderTemplatesList( container, templatesDefinitions )
|
---|
| 14 | {
|
---|
| 15 | // clear loading wait text.
|
---|
| 16 | container.setHtml( '' );
|
---|
| 17 |
|
---|
| 18 | for ( var i = 0, totalDefs = templatesDefinitions.length ; i < totalDefs ; i++ )
|
---|
| 19 | {
|
---|
| 20 | var definition = CKEDITOR.getTemplates( templatesDefinitions[ i ] ),
|
---|
| 21 | imagesPath = definition.imagesPath,
|
---|
| 22 | templates = definition.templates,
|
---|
| 23 | count = templates.length;
|
---|
| 24 |
|
---|
| 25 | for ( var j = 0 ; j < count ; j++ )
|
---|
| 26 | {
|
---|
| 27 | var template = templates[ j ],
|
---|
| 28 | item = createTemplateItem( template, imagesPath );
|
---|
| 29 | item.setAttribute( 'aria-posinset', j + 1 );
|
---|
| 30 | item.setAttribute( 'aria-setsize', count );
|
---|
| 31 | container.append( item );
|
---|
| 32 | }
|
---|
| 33 | }
|
---|
| 34 | }
|
---|
| 35 |
|
---|
| 36 | function createTemplateItem( template, imagesPath )
|
---|
| 37 | {
|
---|
| 38 | var item = CKEDITOR.dom.element.createFromHtml(
|
---|
| 39 | '<a href="javascript:void(0)" tabIndex="-1" role="option" >' +
|
---|
| 40 | '<div class="cke_tpl_item"></div>' +
|
---|
| 41 | '</a>' );
|
---|
| 42 |
|
---|
| 43 | // Build the inner HTML of our new item DIV.
|
---|
| 44 | var html = '<table style="width:350px;" class="cke_tpl_preview" role="presentation"><tr>';
|
---|
| 45 |
|
---|
| 46 | if ( template.image && imagesPath )
|
---|
| 47 | html += '<td class="cke_tpl_preview_img"><img src="' + CKEDITOR.getUrl( imagesPath + template.image ) + '"' + ( CKEDITOR.env.ie6Compat ? ' onload="this.width=this.width"' : '' ) + ' alt="" title=""></td>';
|
---|
| 48 |
|
---|
| 49 | html += '<td style="white-space:normal;"><span class="cke_tpl_title">' + template.title + '</span><br/>';
|
---|
| 50 |
|
---|
| 51 | if ( template.description )
|
---|
| 52 | html += '<span>' + template.description + '</span>';
|
---|
| 53 |
|
---|
| 54 | html += '</td></tr></table>';
|
---|
| 55 |
|
---|
| 56 | item.getFirst().setHtml( html );
|
---|
| 57 |
|
---|
| 58 | item.on( 'click', function() { insertTemplate( template.html ); } );
|
---|
| 59 |
|
---|
| 60 | return item;
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 | /**
|
---|
| 64 | * Insert the specified template content into editor.
|
---|
| 65 | * @param {Number} index
|
---|
| 66 | */
|
---|
| 67 | function insertTemplate( html )
|
---|
| 68 | {
|
---|
| 69 | var dialog = CKEDITOR.dialog.getCurrent(),
|
---|
| 70 | isInsert = dialog.getValueOf( 'selectTpl', 'chkInsertOpt' );
|
---|
| 71 |
|
---|
| 72 | if ( isInsert )
|
---|
| 73 | {
|
---|
| 74 | // Everything should happen after the document is loaded (#4073).
|
---|
| 75 | editor.on( 'contentDom', function( evt )
|
---|
| 76 | {
|
---|
| 77 | evt.removeListener();
|
---|
| 78 | dialog.hide();
|
---|
| 79 |
|
---|
| 80 | // Place the cursor at the first editable place.
|
---|
| 81 | var range = new CKEDITOR.dom.range( editor.document );
|
---|
| 82 | range.moveToElementEditStart( editor.document.getBody() );
|
---|
| 83 | range.select( 1 );
|
---|
| 84 | setTimeout( function()
|
---|
| 85 | {
|
---|
| 86 | editor.fire( 'saveSnapshot' );
|
---|
| 87 | }, 0 );
|
---|
| 88 | });
|
---|
| 89 |
|
---|
| 90 | editor.fire( 'saveSnapshot' );
|
---|
| 91 | editor.setData( html );
|
---|
| 92 | }
|
---|
| 93 | else
|
---|
| 94 | {
|
---|
| 95 | editor.insertHtml( html );
|
---|
| 96 | dialog.hide();
|
---|
| 97 | }
|
---|
| 98 | }
|
---|
| 99 |
|
---|
| 100 | function keyNavigation( evt )
|
---|
| 101 | {
|
---|
| 102 | var target = evt.data.getTarget(),
|
---|
| 103 | onList = listContainer.equals( target );
|
---|
| 104 |
|
---|
| 105 | // Keyboard navigation for template list.
|
---|
| 106 | if ( onList || listContainer.contains( target ) )
|
---|
| 107 | {
|
---|
| 108 | var keystroke = evt.data.getKeystroke(),
|
---|
| 109 | items = listContainer.getElementsByTag( 'a' ),
|
---|
| 110 | focusItem;
|
---|
| 111 |
|
---|
| 112 | if ( items )
|
---|
| 113 | {
|
---|
| 114 | // Focus not yet onto list items?
|
---|
| 115 | if ( onList )
|
---|
| 116 | focusItem = items.getItem( 0 );
|
---|
| 117 | else
|
---|
| 118 | {
|
---|
| 119 | switch ( keystroke )
|
---|
| 120 | {
|
---|
| 121 | case 40 : // ARROW-DOWN
|
---|
| 122 | focusItem = target.getNext();
|
---|
| 123 | break;
|
---|
| 124 |
|
---|
| 125 | case 38 : // ARROW-UP
|
---|
| 126 | focusItem = target.getPrevious();
|
---|
| 127 | break;
|
---|
| 128 |
|
---|
| 129 | case 13 : // ENTER
|
---|
| 130 | case 32 : // SPACE
|
---|
| 131 | target.fire( 'click' );
|
---|
| 132 | }
|
---|
| 133 | }
|
---|
| 134 |
|
---|
| 135 | if ( focusItem )
|
---|
| 136 | {
|
---|
| 137 | focusItem.focus();
|
---|
| 138 | evt.data.preventDefault();
|
---|
| 139 | }
|
---|
| 140 | }
|
---|
| 141 | }
|
---|
| 142 | }
|
---|
| 143 |
|
---|
| 144 | // Load skin at first.
|
---|
| 145 | CKEDITOR.skins.load( editor, 'templates' );
|
---|
| 146 |
|
---|
| 147 | var listContainer;
|
---|
| 148 |
|
---|
| 149 | var templateListLabelId = 'cke_tpl_list_label_' + CKEDITOR.tools.getNextNumber(),
|
---|
| 150 | lang = editor.lang.templates,
|
---|
| 151 | config = editor.config;
|
---|
| 152 | return {
|
---|
| 153 | title :editor.lang.templates.title,
|
---|
| 154 |
|
---|
| 155 | minWidth : CKEDITOR.env.ie ? 440 : 400,
|
---|
| 156 | minHeight : 340,
|
---|
| 157 |
|
---|
| 158 | contents :
|
---|
| 159 | [
|
---|
| 160 | {
|
---|
| 161 | id :'selectTpl',
|
---|
| 162 | label : lang.title,
|
---|
| 163 | elements :
|
---|
| 164 | [
|
---|
| 165 | {
|
---|
| 166 | type : 'vbox',
|
---|
| 167 | padding : 5,
|
---|
| 168 | children :
|
---|
| 169 | [
|
---|
| 170 | {
|
---|
| 171 | id : 'selectTplText',
|
---|
| 172 | type : 'html',
|
---|
| 173 | html :
|
---|
| 174 | '<span>' +
|
---|
| 175 | lang.selectPromptMsg +
|
---|
| 176 | '</span>'
|
---|
| 177 | },
|
---|
| 178 | {
|
---|
| 179 | id : 'templatesList',
|
---|
| 180 | type : 'html',
|
---|
| 181 | focus: true,
|
---|
| 182 | html :
|
---|
| 183 | '<div class="cke_tpl_list" tabIndex="-1" role="listbox" aria-labelledby="' + templateListLabelId+ '">' +
|
---|
| 184 | '<div class="cke_tpl_loading"><span></span></div>' +
|
---|
| 185 | '</div>' +
|
---|
| 186 | '<span class="cke_voice_label" id="' + templateListLabelId + '">' + lang.options+ '</span>'
|
---|
| 187 | },
|
---|
| 188 | {
|
---|
| 189 | id : 'chkInsertOpt',
|
---|
| 190 | type : 'checkbox',
|
---|
| 191 | label : lang.insertOption,
|
---|
| 192 | 'default' : config.templates_replaceContent
|
---|
| 193 | }
|
---|
| 194 | ]
|
---|
| 195 | }
|
---|
| 196 | ]
|
---|
| 197 | }
|
---|
| 198 | ],
|
---|
| 199 |
|
---|
| 200 | buttons : [ CKEDITOR.dialog.cancelButton ],
|
---|
| 201 |
|
---|
| 202 | onShow : function()
|
---|
| 203 | {
|
---|
| 204 | var templatesListField = this.getContentElement( 'selectTpl' , 'templatesList' );
|
---|
| 205 | listContainer = templatesListField.getElement();
|
---|
| 206 |
|
---|
| 207 | CKEDITOR.loadTemplates( config.templates_files, function()
|
---|
| 208 | {
|
---|
| 209 | var templates = ( config.templates || 'default' ).split( ',' );
|
---|
| 210 |
|
---|
| 211 | if ( templates.length )
|
---|
| 212 | {
|
---|
| 213 | renderTemplatesList( listContainer, templates );
|
---|
| 214 | templatesListField.focus();
|
---|
| 215 | }
|
---|
| 216 | else
|
---|
| 217 | {
|
---|
| 218 | listContainer.setHtml(
|
---|
| 219 | '<div class="cke_tpl_empty">' +
|
---|
| 220 | '<span>' + lang.emptyListMsg + '</span>' +
|
---|
| 221 | '</div>' );
|
---|
| 222 | }
|
---|
| 223 | });
|
---|
| 224 |
|
---|
| 225 | this._.element.on( 'keydown', keyNavigation );
|
---|
| 226 | },
|
---|
| 227 |
|
---|
| 228 | onHide : function()
|
---|
| 229 | {
|
---|
| 230 | this._.element.removeListener( 'keydown', keyNavigation );
|
---|
| 231 | }
|
---|
| 232 | };
|
---|
| 233 | });
|
---|
| 234 | })();
|
---|