fckselection_gecko.js
上传用户:ah_jiwei
上传日期:2022-07-24
资源大小:54044k
文件大小:6k
源码类别:

数据库编程

开发平台:

Visual C++

  1. /*
  2.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3.  * Copyright (C) 2003-2007 Frederico Caldeira Knabben
  4.  *
  5.  * == BEGIN LICENSE ==
  6.  *
  7.  * Licensed under the terms of any of the following licenses at your
  8.  * choice:
  9.  *
  10.  *  - GNU General Public License Version 2 or later (the "GPL")
  11.  *    http://www.gnu.org/licenses/gpl.html
  12.  *
  13.  *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
  14.  *    http://www.gnu.org/licenses/lgpl.html
  15.  *
  16.  *  - Mozilla Public License Version 1.1 or later (the "MPL")
  17.  *    http://www.mozilla.org/MPL/MPL-1.1.html
  18.  *
  19.  * == END LICENSE ==
  20.  *
  21.  * Active selection functions. (Gecko specific implementation)
  22.  */
  23. // Get the selection type (like document.select.type in IE).
  24. FCKSelection.GetType = function()
  25. {
  26. // By default set the type to "Text".
  27. var type = 'Text' ;
  28. // Check if the actual selection is a Control (IMG, TABLE, HR, etc...).
  29. var sel ;
  30. try { sel = FCK.EditorWindow.getSelection() ; } catch (e) {}
  31. if ( sel && sel.rangeCount == 1 )
  32. {
  33. var range = sel.getRangeAt(0) ;
  34. if ( range.startContainer == range.endContainer
  35. && ( range.endOffset - range.startOffset ) == 1
  36. && range.startContainer.nodeType == 1
  37. && FCKListsLib.StyleObjectElements[ range.startContainer.childNodes[ range.startOffset ].nodeName.toLowerCase() ] )
  38. {
  39. type = 'Control' ;
  40. }
  41. }
  42. return type ;
  43. }
  44. // Retrieves the selected element (if any), just in the case that a single
  45. // element (object like and image or a table) is selected.
  46. FCKSelection.GetSelectedElement = function()
  47. {
  48. var selectedElement = null ;
  49. var selection = !!FCK.EditorWindow && FCK.EditorWindow.getSelection() ;
  50. if ( selection && selection.anchorNode && selection.anchorNode.nodeType == 1 )
  51. {
  52. // This one is good for all browsers, expect Safari Mac.
  53. selectedElement = selection.anchorNode.childNodes[ selection.anchorOffset ] ;
  54. // For Safari (Mac only), the anchor node for a control selection is
  55. // the control itself, which seams logic. FF and Opera use the parent
  56. // as the anchor node, pointing to the control with the offset.
  57. // As FF created the selection "standard", Safari would do better by
  58. // following their steps.
  59. if ( !selectedElement )
  60. selectedElement = selection.anchorNode ;
  61. else if ( selectedElement.nodeType != 1 )
  62. return null ;
  63. }
  64. return selectedElement ;
  65. }
  66. FCKSelection.GetParentElement = function()
  67. {
  68. if ( this.GetType() == 'Control' )
  69. return FCKSelection.GetSelectedElement().parentNode ;
  70. else
  71. {
  72. var oSel = FCK.EditorWindow.getSelection() ;
  73. if ( oSel )
  74. {
  75. // make the common case fast - for collapsed/nearly collapsed selections just return anchor.parent.
  76. if ( oSel.anchorNode && oSel.anchorNode == oSel.focusNode )
  77. return oSel.anchorNode.parentNode ;
  78. // looks like we're having a large selection here. To make the behavior same as IE's TextRange.parentElement(),
  79. // we need to find the nearest ancestor node which encapsulates both the beginning and the end of the selection.
  80. // TODO: A simpler logic can be found.
  81. var anchorPath = new FCKElementPath( oSel.anchorNode ) ;
  82. var focusPath = new FCKElementPath( oSel.focusNode ) ;
  83. var deepPath = null ;
  84. var shallowPath = null ;
  85. if ( anchorPath.Elements.length > focusPath.Elements.length )
  86. {
  87. deepPath = anchorPath.Elements ;
  88. shallowPath = focusPath.Elements ;
  89. }
  90. else
  91. {
  92. deepPath = focusPath.Elements ;
  93. shallowPath = anchorPath.Elements ;
  94. }
  95. var deepPathBase = deepPath.length - shallowPath.length ;
  96. for( var i = 0 ; i < shallowPath.length ; i++)
  97. {
  98. if ( deepPath[deepPathBase + i] == shallowPath[i])
  99. return shallowPath[i];
  100. }
  101. return null ;
  102. }
  103. }
  104. return null ;
  105. }
  106. FCKSelection.GetBoundaryParentElement = function( startBoundary )
  107. {
  108. if ( ! FCK.EditorWindow )
  109. return null ;
  110. if ( this.GetType() == 'Control' )
  111. return FCKSelection.GetSelectedElement().parentNode ;
  112. else
  113. {
  114. var oSel = FCK.EditorWindow.getSelection() ;
  115. if ( oSel && oSel.rangeCount > 0 )
  116. {
  117. var range = oSel.getRangeAt( startBoundary ? 0 : ( oSel.rangeCount - 1 ) ) ;
  118. var element = startBoundary ? range.startContainer : range.endContainer ;
  119. return ( element.nodeType == 1 ? element : element.parentNode ) ;
  120. }
  121. }
  122. return null ;
  123. }
  124. FCKSelection.SelectNode = function( element )
  125. {
  126. var oRange = FCK.EditorDocument.createRange() ;
  127. oRange.selectNode( element ) ;
  128. var oSel = FCK.EditorWindow.getSelection() ;
  129. oSel.removeAllRanges() ;
  130. oSel.addRange( oRange ) ;
  131. }
  132. FCKSelection.Collapse = function( toStart )
  133. {
  134. var oSel = FCK.EditorWindow.getSelection() ;
  135. if ( toStart == null || toStart === true )
  136. oSel.collapseToStart() ;
  137. else
  138. oSel.collapseToEnd() ;
  139. }
  140. // The "nodeTagName" parameter must be Upper Case.
  141. FCKSelection.HasAncestorNode = function( nodeTagName )
  142. {
  143. var oContainer = this.GetSelectedElement() ;
  144. if ( ! oContainer && FCK.EditorWindow )
  145. {
  146. try { oContainer = FCK.EditorWindow.getSelection().getRangeAt(0).startContainer ; }
  147. catch(e){}
  148. }
  149. while ( oContainer )
  150. {
  151. if ( oContainer.nodeType == 1 && oContainer.tagName == nodeTagName ) return true ;
  152. oContainer = oContainer.parentNode ;
  153. }
  154. return false ;
  155. }
  156. // The "nodeTagName" parameter must be Upper Case.
  157. FCKSelection.MoveToAncestorNode = function( nodeTagName )
  158. {
  159. var oNode ;
  160. var oContainer = this.GetSelectedElement() ;
  161. if ( ! oContainer )
  162. oContainer = FCK.EditorWindow.getSelection().getRangeAt(0).startContainer ;
  163. while ( oContainer )
  164. {
  165. if ( oContainer.nodeName == nodeTagName )
  166. return oContainer ;
  167. oContainer = oContainer.parentNode ;
  168. }
  169. return null ;
  170. }
  171. FCKSelection.Delete = function()
  172. {
  173. // Gets the actual selection.
  174. var oSel = FCK.EditorWindow.getSelection() ;
  175. // Deletes the actual selection contents.
  176. for ( var i = 0 ; i < oSel.rangeCount ; i++ )
  177. {
  178. oSel.getRangeAt(i).deleteContents() ;
  179. }
  180. return oSel ;
  181. }