2 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
\r
3 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
\r
5 * == BEGIN LICENSE ==
\r
7 * Licensed under the terms of any of the following licenses at your
\r
10 * - GNU General Public License Version 2 or later (the "GPL")
\r
11 * http://www.gnu.org/licenses/gpl.html
\r
13 * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
\r
14 * http://www.gnu.org/licenses/lgpl.html
\r
16 * - Mozilla Public License Version 1.1 or later (the "MPL")
\r
17 * http://www.mozilla.org/MPL/MPL-1.1.html
\r
21 * Active selection functions. (IE specific implementation)
\r
24 // Get the selection type.
\r
25 FCKSelection.GetType = function()
\r
27 // It is possible that we can still get a text range object even when type=='None' is returned by IE.
\r
28 // So we'd better check the object returned by createRange() rather than by looking at the type.
\r
31 var ieType = FCKSelection.GetSelection().type ;
\r
32 if ( ieType == 'Control' || ieType == 'Text' )
\r
35 if ( this.GetSelection().createRange().parentElement )
\r
40 // Nothing to do, it will return None properly.
\r
46 // Retrieves the selected element (if any), just in the case that a single
\r
47 // element (object like and image or a table) is selected.
\r
48 FCKSelection.GetSelectedElement = function()
\r
50 if ( this.GetType() == 'Control' )
\r
52 var oRange = this.GetSelection().createRange() ;
\r
54 if ( oRange && oRange.item )
\r
55 return this.GetSelection().createRange().item(0) ;
\r
60 FCKSelection.GetParentElement = function()
\r
62 switch ( this.GetType() )
\r
65 var el = FCKSelection.GetSelectedElement() ;
\r
66 return el ? el.parentElement : null ;
\r
72 return this.GetSelection().createRange().parentElement() ;
\r
76 FCKSelection.GetBoundaryParentElement = function( startBoundary )
\r
78 switch ( this.GetType() )
\r
81 var el = FCKSelection.GetSelectedElement() ;
\r
82 return el ? el.parentElement : null ;
\r
88 var doc = FCK.EditorDocument ;
\r
90 var range = doc.selection.createRange() ;
\r
91 range.collapse( startBoundary !== false ) ;
\r
93 var el = range.parentElement() ;
\r
95 // It may happen that range is comming from outside "doc", so we
\r
96 // must check it (#1204).
\r
97 return FCKTools.GetElementDocument( el ) == doc ? el : null ;
\r
101 FCKSelection.SelectNode = function( node )
\r
104 this.GetSelection().empty() ;
\r
108 // Try to select the node as a control.
\r
109 oRange = FCK.EditorDocument.body.createControlRange() ;
\r
110 oRange.addElement( node ) ;
\r
114 // If failed, select it as a text range.
\r
115 oRange = FCK.EditorDocument.body.createTextRange() ;
\r
116 oRange.moveToElementText( node ) ;
\r
122 FCKSelection.Collapse = function( toStart )
\r
125 if ( this.GetType() == 'Text' )
\r
127 var oRange = this.GetSelection().createRange() ;
\r
128 oRange.collapse( toStart == null || toStart === true ) ;
\r
133 // The "nodeTagName" parameter must be Upper Case.
\r
134 FCKSelection.HasAncestorNode = function( nodeTagName )
\r
138 if ( this.GetSelection().type == "Control" )
\r
140 oContainer = this.GetSelectedElement() ;
\r
144 var oRange = this.GetSelection().createRange() ;
\r
145 oContainer = oRange.parentElement() ;
\r
148 while ( oContainer )
\r
150 if ( oContainer.nodeName.IEquals( nodeTagName ) ) return true ;
\r
151 oContainer = oContainer.parentNode ;
\r
157 // The "nodeTagName" parameter must be UPPER CASE.
\r
158 // It can be also an array of names
\r
159 FCKSelection.MoveToAncestorNode = function( nodeTagName )
\r
161 var oNode, oRange ;
\r
163 if ( ! FCK.EditorDocument )
\r
166 if ( this.GetSelection().type == "Control" )
\r
168 oRange = this.GetSelection().createRange() ;
\r
169 for ( i = 0 ; i < oRange.length ; i++ )
\r
171 if (oRange(i).parentNode)
\r
173 oNode = oRange(i).parentNode ;
\r
180 oRange = this.GetSelection().createRange() ;
\r
181 oNode = oRange.parentElement() ;
\r
184 while ( oNode && !oNode.nodeName.Equals( nodeTagName ) )
\r
185 oNode = oNode.parentNode ;
\r
190 FCKSelection.Delete = function()
\r
192 // Gets the actual selection.
\r
193 var oSel = this.GetSelection() ;
\r
195 // Deletes the actual selection contents.
\r
196 if ( oSel.type.toLowerCase() != "none" )
\r
205 * Returns the native selection object.
\r
207 FCKSelection.GetSelection = function()
\r
210 return FCK.EditorDocument.selection ;
\r
213 FCKSelection.Save = function( lock )
\r
215 var editorDocument = FCK.EditorDocument ;
\r
217 if ( !editorDocument )
\r
220 // Avoid saving again a selection while a dialog is open #2616
\r
223 this.locked = !!lock ;
\r
225 var selection = editorDocument.selection ;
\r
230 // The call might fail if the document doesn't have the focus (#1801),
\r
231 // but we don't want to modify the current selection (#2495) with a call to FCK.Focus() ;
\r
233 range = selection.createRange() ;
\r
237 // Ensure that the range comes from the editor document.
\r
240 if ( range.parentElement && FCKTools.GetElementDocument( range.parentElement() ) != editorDocument )
\r
242 else if ( range.item && FCKTools.GetElementDocument( range.item(0) )!= editorDocument )
\r
247 this.SelectionData = range ;
\r
250 FCKSelection._GetSelectionDocument = function( selection )
\r
252 var range = selection.createRange() ;
\r
255 else if ( range.item )
\r
256 return FCKTools.GetElementDocument( range.item( 0 ) ) ;
\r
258 return FCKTools.GetElementDocument( range.parentElement() ) ;
\r
261 FCKSelection.Restore = function()
\r
263 if ( this.SelectionData )
\r
265 FCK.IsSelectionChangeLocked = true ;
\r
269 // Don't repeat the restore process if the editor document is already selected.
\r
270 if ( String( this._GetSelectionDocument( FCK.EditorDocument.selection ).body.contentEditable ) == 'true' )
\r
272 FCK.IsSelectionChangeLocked = false ;
\r
275 this.SelectionData.select() ;
\r
279 FCK.IsSelectionChangeLocked = false ;
\r
283 FCKSelection.Release = function()
\r
285 this.locked = false ;
\r
286 delete this.SelectionData ;
\r