var plugin = CKEDITOR.plugins.link,\r
initialLinkText;\r
\r
+ function createRangeForLink( editor, link ) {\r
+ var range = editor.createRange();\r
+\r
+ range.setStartBefore( link );\r
+ range.setEndAfter( link );\r
+\r
+ return range;\r
+ }\r
+\r
+ function insertLinksIntoSelection( editor, data ) {\r
+ var attributes = plugin.getLinkAttributes( editor, data ),\r
+ ranges = editor.getSelection().getRanges(),\r
+ style = new CKEDITOR.style( {\r
+ element: 'a',\r
+ attributes: attributes.set\r
+ } ),\r
+ rangesToSelect = [],\r
+ range,\r
+ text,\r
+ nestedLinks,\r
+ i,\r
+ j;\r
+\r
+ style.type = CKEDITOR.STYLE_INLINE; // need to override... dunno why.\r
+\r
+ for ( i = 0; i < ranges.length; i++ ) {\r
+ range = ranges[ i ];\r
+\r
+ // Use link URL as text with a collapsed cursor.\r
+ if ( range.collapsed ) {\r
+ // Short mailto link text view (http://dev.ckeditor.com/ticket/5736).\r
+ text = new CKEDITOR.dom.text( data.linkText || ( data.type == 'email' ?\r
+ data.email.address : attributes.set[ 'data-cke-saved-href' ] ), editor.document );\r
+ range.insertNode( text );\r
+ range.selectNodeContents( text );\r
+ } else if ( initialLinkText !== data.linkText ) {\r
+ text = new CKEDITOR.dom.text( data.linkText, editor.document );\r
+\r
+ // Shrink range to preserve block element.\r
+ range.shrink( CKEDITOR.SHRINK_TEXT );\r
+\r
+ // Use extractHtmlFromRange to remove markup within the selection. Also this method is a little\r
+ // smarter than range#deleteContents as it plays better e.g. with table cells.\r
+ editor.editable().extractHtmlFromRange( range );\r
+\r
+ range.insertNode( text );\r
+ }\r
+\r
+ // Editable links nested within current range should be removed, so that the link is applied to whole selection.\r
+ nestedLinks = range._find( 'a' );\r
+\r
+ for ( j = 0; j < nestedLinks.length; j++ ) {\r
+ nestedLinks[ j ].remove( true );\r
+ }\r
+\r
+\r
+ // Apply style.\r
+ style.applyToRange( range, editor );\r
+\r
+ rangesToSelect.push( range );\r
+ }\r
+\r
+ editor.getSelection().selectRanges( rangesToSelect );\r
+ }\r
+\r
+ function editLinksInSelection( editor, selectedElements, data ) {\r
+ var attributes = plugin.getLinkAttributes( editor, data ),\r
+ ranges = [],\r
+ element,\r
+ href,\r
+ textView,\r
+ newText,\r
+ i;\r
+\r
+ for ( i = 0; i < selectedElements.length; i++ ) {\r
+ // We're only editing an existing link, so just overwrite the attributes.\r
+ element = selectedElements[ i ];\r
+ href = element.data( 'cke-saved-href' );\r
+ textView = element.getHtml();\r
+\r
+ element.setAttributes( attributes.set );\r
+ element.removeAttributes( attributes.removed );\r
+\r
+\r
+ if ( data.linkText && initialLinkText != data.linkText ) {\r
+ // Display text has been changed.\r
+ newText = data.linkText;\r
+ } else if ( href == textView || data.type == 'email' && textView.indexOf( '@' ) != -1 ) {\r
+ // Update text view when user changes protocol (http://dev.ckeditor.com/ticket/4612).\r
+ // Short mailto link text view (http://dev.ckeditor.com/ticket/5736).\r
+ newText = data.type == 'email' ? data.email.address : attributes.set[ 'data-cke-saved-href' ];\r
+ }\r
+\r
+ if ( newText ) {\r
+ element.setText( newText );\r
+ }\r
+\r
+ ranges.push( createRangeForLink( editor, element ) );\r
+ }\r
+\r
+ // We changed the content, so need to select it again.\r
+ editor.getSelection().selectRanges( ranges );\r
+ }\r
+\r
// Handles the event when the "Target" selection box is changed.\r
var targetChanged = function() {\r
var dialog = this.getDialog(),\r
label: commonLang.protocol,\r
'default': 'http://',\r
items: [\r
- // Force 'ltr' for protocol names in BIDI. (#5433)\r
+ // Force 'ltr' for protocol names in BIDI. (http://dev.ckeditor.com/ticket/5433)\r
[ 'http://\u200E', 'http://' ],\r
[ 'https://\u200E', 'https://' ],\r
[ 'ftp://\u200E', 'ftp://' ],\r
},\r
commit: function( data ) {\r
// IE will not trigger the onChange event if the mouse has been used\r
- // to carry all the operations #4724\r
+ // to carry all the operations http://dev.ckeditor.com/ticket/4724\r
this.onChange();\r
\r
if ( !data.url )\r
onShow: function() {\r
var editor = this.getParentEditor(),\r
selection = editor.getSelection(),\r
- selectedElement = selection.getSelectedElement(),\r
displayTextField = this.getContentElement( 'info', 'linkDisplayText' ).getElement().getParent().getParent(),\r
- element = null;\r
+ elements = plugin.getSelectedLink( editor, true ),\r
+ firstLink = elements[ 0 ] || null;\r
\r
// Fill in all the relevant fields if there's already one link selected.\r
- if ( ( element = plugin.getSelectedLink( editor ) ) && element.hasAttribute( 'href' ) ) {\r
+ if ( firstLink && firstLink.hasAttribute( 'href' ) ) {\r
// Don't change selection if some element is already selected.\r
// For example - don't destroy fake selection.\r
- if ( !selectedElement ) {\r
- selection.selectElement( element );\r
- selectedElement = element;\r
+ if ( !selection.getSelectedElement() && !selection.isInTable() ) {\r
+ selection.selectElement( firstLink );\r
}\r
- } else {\r
- element = null;\r
}\r
\r
+ var data = plugin.parseLinkAttributes( editor, firstLink );\r
+\r
// Here we'll decide whether or not we want to show Display Text field.\r
- if ( plugin.showDisplayTextForElement( selectedElement, editor ) ) {\r
+ if ( elements.length <= 1 && plugin.showDisplayTextForElement( firstLink, editor ) ) {\r
displayTextField.show();\r
} else {\r
displayTextField.hide();\r
}\r
\r
- var data = plugin.parseLinkAttributes( editor, element );\r
-\r
// Record down the selected element in the dialog.\r
- this._.selectedElement = element;\r
+ this._.selectedElements = elements;\r
\r
this.setupContent( data );\r
},\r
// Collect data from fields.\r
this.commitContent( data );\r
\r
- var selection = editor.getSelection(),\r
- attributes = plugin.getLinkAttributes( editor, data ),\r
- bm,\r
- nestedLinks;\r
-\r
- if ( !this._.selectedElement ) {\r
- var range = selection.getRanges()[ 0 ],\r
- text;\r
-\r
- // Use link URL as text with a collapsed cursor.\r
- if ( range.collapsed ) {\r
- // Short mailto link text view (#5736).\r
- text = new CKEDITOR.dom.text( data.linkText || ( data.type == 'email' ?\r
- data.email.address : attributes.set[ 'data-cke-saved-href' ] ), editor.document );\r
- range.insertNode( text );\r
- range.selectNodeContents( text );\r
- } else if ( initialLinkText !== data.linkText ) {\r
- text = new CKEDITOR.dom.text( data.linkText, editor.document );\r
-\r
- // Shrink range to preserve block element.\r
- range.shrink( CKEDITOR.SHRINK_TEXT );\r
-\r
- // Use extractHtmlFromRange to remove markup within the selection. Also this method is a little\r
- // smarter than range#deleteContents as it plays better e.g. with table cells.\r
- editor.editable().extractHtmlFromRange( range );\r
-\r
- range.insertNode( text );\r
- }\r
-\r
- // Editable links nested within current range should be removed, so that the link is applied to whole selection.\r
- nestedLinks = range._find( 'a' );\r
-\r
- for ( var i = 0; i < nestedLinks.length; i++ ) {\r
- nestedLinks[ i ].remove( true );\r
- }\r
-\r
- // Apply style.\r
- var style = new CKEDITOR.style( {\r
- element: 'a',\r
- attributes: attributes.set\r
- } );\r
-\r
- style.type = CKEDITOR.STYLE_INLINE; // need to override... dunno why.\r
- style.applyToRange( range, editor );\r
- range.select();\r
+ if ( !this._.selectedElements.length ) {\r
+ insertLinksIntoSelection( editor, data );\r
} else {\r
- // We're only editing an existing link, so just overwrite the attributes.\r
- var element = this._.selectedElement,\r
- href = element.data( 'cke-saved-href' ),\r
- textView = element.getHtml(),\r
- newText;\r
-\r
- element.setAttributes( attributes.set );\r
- element.removeAttributes( attributes.removed );\r
-\r
- if ( data.linkText && initialLinkText != data.linkText ) {\r
- // Display text has been changed.\r
- newText = data.linkText;\r
- } else if ( href == textView || data.type == 'email' && textView.indexOf( '@' ) != -1 ) {\r
- // Update text view when user changes protocol (#4612).\r
- // Short mailto link text view (#5736).\r
- newText = data.type == 'email' ? data.email.address : attributes.set[ 'data-cke-saved-href' ];\r
- }\r
-\r
- if ( newText ) {\r
- element.setText( newText );\r
- // We changed the content, so need to select it again.\r
- selection.selectElement( element );\r
- }\r
+ editLinksInSelection( editor, this._.selectedElements, data );\r
\r
- delete this._.selectedElement;\r
+ delete this._.selectedElements;\r
}\r
},\r
onLoad: function() {\r