X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Ftable%2Fdialogs%2Ftable.js;h=859f0fedb1f45b4ccaf28c8160fee74841699835;hb=3fe9cac293e090ea459a3ee10d78cbe9e1dd0e03;hp=215a373d4bfbf29834e47fa761f0c4b8e5264ed5;hpb=941b0a9ba4e673e292510d80a5a86806994b8ea6;p=ckeditor.git diff --git a/_source/plugins/table/dialogs/table.js b/_source/plugins/table/dialogs/table.js index 215a373..859f0fe 100644 --- a/_source/plugins/table/dialogs/table.js +++ b/_source/plugins/table/dialogs/table.js @@ -1,12 +1,11 @@ /* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ (function() { - var widthPattern = /^(\d+(?:\.\d+)?)(px|%)$/, - heightPattern = /^(\d+(?:\.\d+)?)px$/; + var defaultToPixel = CKEDITOR.tools.cssLength; var commitValue = function( data ) { @@ -16,14 +15,82 @@ For licensing, see LICENSE.html or http://ckeditor.com/license data.info[id] = this.getValue(); }; + function tableColumns( table ) + { + var cols = 0, maxCols = 0; + for ( var i = 0, row, rows = table.$.rows.length; i < rows; i++ ) + { + row = table.$.rows[ i ], cols = 0; + for ( var j = 0, cell, cells = row.cells.length; j < cells; j++ ) + { + cell = row.cells[ j ]; + cols += cell.colSpan; + } + + cols > maxCols && ( maxCols = cols ); + } + + return maxCols; + } + + + // Whole-positive-integer validator. + function validatorNum( msg ) + { + return function() + { + var value = this.getValue(), + pass = !!( CKEDITOR.dialog.validate.integer()( value ) && value > 0 ); + + if ( !pass ) + { + alert( msg ); + this.select(); + } + + return pass; + }; + } + function tableDialog( editor, command ) { - var makeElement = function( name ){ return new CKEDITOR.dom.element( name, editor.document ); }; + var makeElement = function( name ) + { + return new CKEDITOR.dom.element( name, editor.document ); + }; + + var dialogadvtab = editor.plugins.dialogadvtab; return { title : editor.lang.table.title, minWidth : 310, minHeight : CKEDITOR.env.ie ? 310 : 280, + + onLoad : function() + { + var dialog = this; + + var styles = dialog.getContentElement( 'advanced', 'advStyles' ); + + if ( styles ) + { + styles.on( 'change', function( evt ) + { + // Synchronize width value. + var width = this.getStyle( 'width', '' ), + txtWidth = dialog.getContentElement( 'info', 'txtWidth' ); + + txtWidth && txtWidth.setValue( width, true ); + + // Synchronize height value. + var height = this.getStyle( 'height', '' ), + txtHeight = dialog.getContentElement( 'info', 'txtHeight' ); + + txtHeight && txtHeight.setValue( height, true ); + }); + } + }, + onShow : function() { // Detect if there's a selected table. @@ -33,16 +100,20 @@ For licensing, see LICENSE.html or http://ckeditor.com/license var rowsInput = this.getContentElement( 'info', 'txtRows' ), colsInput = this.getContentElement( 'info', 'txtCols' ), - widthInput = this.getContentElement( 'info', 'txtWidth' ); + widthInput = this.getContentElement( 'info', 'txtWidth' ), + heightInput = this.getContentElement( 'info', 'txtHeight' ); + if ( command == 'tableProperties' ) { - if ( ( selectedTable = editor.getSelection().getSelectedElement() ) ) - { - if ( selectedTable.getName() != 'table' ) - selectedTable = null; - } + if ( ( selectedTable = selection.getSelectedElement() ) ) + selectedTable = selectedTable.getAscendant( 'table', true ); else if ( ranges.length > 0 ) { + // Webkit could report the following range on cell selection (#4948): + //
] + if ( CKEDITOR.env.webkit ) + ranges[ 0 ].shrink( CKEDITOR.NODE_ELEMENT ); + var rangeRoot = ranges[0].getCommonAncestor( true ); selectedTable = rangeRoot.getAscendant( 'table', true ); } @@ -51,28 +122,28 @@ For licensing, see LICENSE.html or http://ckeditor.com/license this._.selectedElement = selectedTable; } - // Enable, disable and select the row, cols, width fields. + // Enable or disable the row, cols, width fields. if ( selectedTable ) { this.setupContent( selectedTable ); rowsInput && rowsInput.disable(); colsInput && colsInput.disable(); - widthInput && widthInput.select(); } else { rowsInput && rowsInput.enable(); colsInput && colsInput.enable(); - rowsInput && rowsInput.select(); } + + // Call the onChange method for the widht and height fields so + // they get reflected into the Advanced tab. + widthInput && widthInput.onChange(); + heightInput && heightInput.onChange(); }, onOk : function() { - if ( this._.selectedElement ) - { - var selection = editor.getSelection(), - bms = editor.getSelection().createBookmarks(); - } + var selection = editor.getSelection(), + bms = this._.selectedElement && selection.createBookmarks(); var table = this._.selectedElement || makeElement( 'table' ), me = this, @@ -118,7 +189,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license for ( i = 0 ; i < theRow.getChildCount() ; i++ ) { var th = theRow.getChild( i ); - if ( th.type == CKEDITOR.NODE_ELEMENT ) + // Skip bookmark nodes. (#6155) + if ( th.type == CKEDITOR.NODE_ELEMENT && !th.data( 'cke-bookmark' ) ) { th.renameNode( 'th' ); th.setAttribute( 'scope', 'col' ); @@ -154,7 +226,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license // Should we make all first cells in a row TH? if ( !this.hasColumnHeaders && ( headers == 'col' || headers == 'both' ) ) { - for( row = 0 ; row < table.$.rows.length ; row++ ) + for ( row = 0 ; row < table.$.rows.length ; row++ ) { newCell = new CKEDITOR.dom.element( table.$.rows[ row ].cells[ 0 ] ); newCell.renameNode( 'th' ); @@ -165,7 +237,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license // Should we make all first TH-cells in a row make TD? If 'yes' we do it the other way round :-) if ( ( this.hasColumnHeaders ) && !( headers == 'col' || headers == 'both' ) ) { - for( i = 0 ; i < table.$.rows.length ; i++ ) + for ( i = 0 ; i < table.$.rows.length ; i++ ) { row = new CKEDITOR.dom.element( table.$.rows[i] ); if ( row.getParent().getName() == 'tbody' ) @@ -178,32 +250,31 @@ For licensing, see LICENSE.html or http://ckeditor.com/license } // Set the width and height. - var styles = []; - if ( info.txtHeight ) - table.setStyle( 'height', CKEDITOR.tools.cssLength( info.txtHeight ) ); - else - table.removeStyle( 'height' ); + info.txtHeight ? table.setStyle( 'height', info.txtHeight ) : table.removeStyle( 'height' ); + info.txtWidth ? table.setStyle( 'width', info.txtWidth ) : table.removeStyle( 'width' ); - if ( info.txtWidth ) - { - var type = info.cmbWidthType || 'pixels'; - table.setStyle( 'width', info.txtWidth + ( type == 'pixels' ? 'px' : '%' ) ); - } - else - table.removeStyle( 'width' ); - - if( !table.getAttribute( 'style' ) ) + if ( !table.getAttribute( 'style' ) ) table.removeAttribute( 'style' ); } // Insert the table element if we're creating one. if ( !this._.selectedElement ) + { editor.insertElement( table ); - // Properly restore the selection inside table. (#4822) + // Override the default cursor position after insertElement to place + // cursor inside the first cell (#7959), IE needs a while. + setTimeout( function() + { + var firstCell = new CKEDITOR.dom.element( table.$.rows[ 0 ].cells[ 0 ] ); + var range = new CKEDITOR.dom.range( editor.document ); + range.moveToPosition( firstCell, CKEDITOR.POSITION_AFTER_START ); + range.select( 1 ); + }, 0 ); + } + // Properly restore the selection, (#4822) but don't break + // because of this, e.g. updated table caption. else - selection.selectBookmarks( bms ); - - return true; + try { selection.selectBookmarks( bms ); } catch( er ){} }, contents : [ { @@ -227,20 +298,9 @@ For licensing, see LICENSE.html or http://ckeditor.com/license id : 'txtRows', 'default' : 3, label : editor.lang.table.rows, - style : 'width:5em', - validate : function() - { - var pass = true, - value = this.getValue(); - pass = pass && CKEDITOR.dialog.validate.integer()( value ) - && value > 0; - if ( !pass ) - { - alert( editor.lang.table.invalidRows ); - this.select(); - } - return pass; - }, + required : true, + controlStyle : 'width:5em', + validate : validatorNum( editor.lang.table.invalidRows ), setup : function( selectedElement ) { this.setValue( selectedElement.$.rows.length ); @@ -252,23 +312,12 @@ For licensing, see LICENSE.html or http://ckeditor.com/license id : 'txtCols', 'default' : 2, label : editor.lang.table.columns, - style : 'width:5em', - validate : function() - { - var pass = true, - value = this.getValue(); - pass = pass && CKEDITOR.dialog.validate.integer()( value ) - && value > 0; - if ( !pass ) - { - alert( editor.lang.table.invalidCols ); - this.select(); - } - return pass; - }, + required : true, + controlStyle : 'width:5em', + validate : validatorNum( editor.lang.table.invalidCols ), setup : function( selectedTable ) { - this.setValue( selectedTable.$.rows[0].cells.length); + this.setValue( tableColumns( selectedTable ) ); }, commit : commitValue }, @@ -298,7 +347,8 @@ For licensing, see LICENSE.html or http://ckeditor.com/license for ( var row = 0 ; row < selectedTable.$.rows.length ; row++ ) { // If just one cell isn't a TH then it isn't a header column - if ( selectedTable.$.rows[row].cells[0].nodeName.toLowerCase() != 'th' ) + var headCell = selectedTable.$.rows[row].cells[0]; + if ( headCell && headCell.nodeName.toLowerCase() != 'th' ) { dialog.hasColumnHeaders = false; break; @@ -318,7 +368,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license id : 'txtBorder', 'default' : 1, label : editor.lang.table.border, - style : 'width:3em', + controlStyle : 'width:3em', validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidBorder ), setup : function( selectedTable ) { @@ -336,13 +386,13 @@ For licensing, see LICENSE.html or http://ckeditor.com/license id : 'cmbAlign', type : 'select', 'default' : '', - label : editor.lang.table.align, + label : editor.lang.common.align, items : [ - [ editor.lang.table.alignNotSet , ''], - [ editor.lang.table.alignLeft , 'left'], - [ editor.lang.table.alignCenter , 'center'], - [ editor.lang.table.alignRight , 'right'] + [ editor.lang.common.notSet , ''], + [ editor.lang.common.alignLeft , 'left'], + [ editor.lang.common.alignCenter , 'center'], + [ editor.lang.common.alignRight , 'right'] ], setup : function( selectedTable ) { @@ -371,33 +421,21 @@ For licensing, see LICENSE.html or http://ckeditor.com/license { type : 'text', id : 'txtWidth', - style : 'width:5em', - label : editor.lang.table.width, - 'default' : 200, - validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidWidth ), - setup : function( selectedTable ) + controlStyle : 'width:5em', + label : editor.lang.common.width, + title : editor.lang.common.cssLengthTooltip, + 'default' : 500, + getValue : defaultToPixel, + validate : CKEDITOR.dialog.validate.cssLength( editor.lang.common.invalidCssLength.replace( '%1', editor.lang.common.width ) ), + onChange : function() { - var widthMatch = widthPattern.exec( selectedTable.$.style.width ); - if ( widthMatch ) - this.setValue( widthMatch[1] ); + var styles = this.getDialog().getContentElement( 'advanced', 'advStyles' ); + styles && styles.updateStyle( 'width', this.getValue() ); }, - commit : commitValue - }, - { - id : 'cmbWidthType', - type : 'select', - label : ' ', - 'default' : 'pixels', - items : - [ - [ editor.lang.table.widthPx , 'pixels'], - [ editor.lang.table.widthPc , 'percents'] - ], setup : function( selectedTable ) { - var widthMatch = widthPattern.exec( selectedTable.$.style.width ); - if ( widthMatch ) - this.setValue( widthMatch[2] == 'px' ? 'pixels' : 'percents' ); + var val = selectedTable.getStyle( 'width' ); + val && this.setValue( val ); }, commit : commitValue } @@ -411,21 +449,24 @@ For licensing, see LICENSE.html or http://ckeditor.com/license { type : 'text', id : 'txtHeight', - style : 'width:5em', - label : editor.lang.table.height, + controlStyle : 'width:5em', + label : editor.lang.common.height, + title : editor.lang.common.cssLengthTooltip, 'default' : '', - validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidHeight ), + getValue : defaultToPixel, + validate : CKEDITOR.dialog.validate.cssLength( editor.lang.common.invalidCssLength.replace( '%1', editor.lang.common.height ) ), + onChange : function() + { + var styles = this.getDialog().getContentElement( 'advanced', 'advStyles' ); + styles && styles.updateStyle( 'height', this.getValue() ); + }, + setup : function( selectedTable ) { - var heightMatch = heightPattern.exec( selectedTable.$.style.height ); - if ( heightMatch ) - this.setValue( heightMatch[1] ); + var val = selectedTable.getStyle( 'height' ); + val && this.setValue( val ); }, commit : commitValue - }, - { - type : 'html', - html : '
' + editor.lang.table.widthPx } ] }, @@ -436,10 +477,10 @@ For licensing, see LICENSE.html or http://ckeditor.com/license { type : 'text', id : 'txtCellSpace', - style : 'width:3em', + controlStyle : 'width:3em', label : editor.lang.table.cellSpace, 'default' : 1, - validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidCellSpacing ), + validate : CKEDITOR.dialog.validate.number( editor.lang.table.invalidCellSpacing ), setup : function( selectedTable ) { this.setValue( selectedTable.getAttribute( 'cellSpacing' ) || '' ); @@ -455,10 +496,10 @@ For licensing, see LICENSE.html or http://ckeditor.com/license { type : 'text', id : 'txtCellPad', - style : 'width:3em', + controlStyle : 'width:3em', label : editor.lang.table.cellPad, 'default' : 1, - validate : CKEDITOR.dialog.validate['number']( editor.lang.table.invalidCellPadding ), + validate : CKEDITOR.dialog.validate.number( editor.lang.table.invalidCellPadding ), setup : function( selectedTable ) { this.setValue( selectedTable.getAttribute( 'cellPadding' ) || '' ); @@ -491,17 +532,30 @@ For licensing, see LICENSE.html or http://ckeditor.com/license label : editor.lang.table.caption, setup : function( selectedTable ) { + this.enable(); + var nodeList = selectedTable.getElementsByTag( 'caption' ); if ( nodeList.count() > 0 ) { var caption = nodeList.getItem( 0 ); - caption = ( caption.getChild( 0 ) && caption.getChild( 0 ).getText() ) || ''; - caption = CKEDITOR.tools.trim( caption ); + var firstElementChild = caption.getFirst( CKEDITOR.dom.walker.nodeType( CKEDITOR.NODE_ELEMENT ) ); + + if ( firstElementChild && !firstElementChild.equals( caption.getBogus() ) ) + { + this.disable(); + this.setValue( caption.getText() ); + return; + } + + caption = CKEDITOR.tools.trim( caption.getText() ); this.setValue( caption ); } }, commit : function( data, table ) { + if ( !this.isEnabled() ) + return; + var caption = this.getValue(), captionElement = table.getElementsByTag( 'caption' ); if ( caption ) @@ -540,12 +594,15 @@ For licensing, see LICENSE.html or http://ckeditor.com/license { if ( this.getValue() ) selectedTable.setAttribute( 'summary', this.getValue() ); + else + selectedTable.removeAttribute( 'summary' ); } } ] } ] - } + }, + dialogadvtab && dialogadvtab.createAdvancedTab( editor ) ] }; }