fckcontextmenu.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.  * FCKContextMenu Class: renders an control a context menu.
  22.  */
  23. var FCKContextMenu = function( parentWindow, langDir )
  24. {
  25. this.CtrlDisable = false ;
  26. var oPanel = this._Panel = new FCKPanel( parentWindow ) ;
  27. oPanel.AppendStyleSheet( FCKConfig.SkinPath + 'fck_editor.css' ) ;
  28. oPanel.IsContextMenu = true ;
  29. // The FCKTools.DisableSelection doesn't seems to work to avoid dragging of the icons in Mozilla
  30. // so we stop the start of the dragging
  31. if ( FCKBrowserInfo.IsGecko )
  32. oPanel.Document.addEventListener( 'draggesture', function(e) {e.preventDefault(); return false;}, true ) ;
  33. var oMenuBlock = this._MenuBlock = new FCKMenuBlock() ;
  34. oMenuBlock.Panel = oPanel ;
  35. oMenuBlock.OnClick = FCKTools.CreateEventListener( FCKContextMenu_MenuBlock_OnClick, this ) ;
  36. this._Redraw = true ;
  37. }
  38. FCKContextMenu.prototype.SetMouseClickWindow = function( mouseClickWindow )
  39. {
  40. if ( !FCKBrowserInfo.IsIE )
  41. {
  42. this._Document = mouseClickWindow.document ;
  43. if ( FCKBrowserInfo.IsOpera && !( 'oncontextmenu' in document.createElement('foo') ) )
  44. {
  45. this._Document.addEventListener( 'mousedown', FCKContextMenu_Document_OnMouseDown, false ) ;
  46. this._Document.addEventListener( 'mouseup', FCKContextMenu_Document_OnMouseUp, false ) ;
  47. }
  48. this._Document.addEventListener( 'contextmenu', FCKContextMenu_Document_OnContextMenu, false ) ;
  49. }
  50. }
  51. FCKContextMenu.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled )
  52. {
  53. var oItem = this._MenuBlock.AddItem( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled) ;
  54. this._Redraw = true ;
  55. return oItem ;
  56. }
  57. FCKContextMenu.prototype.AddSeparator = function()
  58. {
  59. this._MenuBlock.AddSeparator() ;
  60. this._Redraw = true ;
  61. }
  62. FCKContextMenu.prototype.RemoveAllItems = function()
  63. {
  64. this._MenuBlock.RemoveAllItems() ;
  65. this._Redraw = true ;
  66. }
  67. FCKContextMenu.prototype.AttachToElement = function( element )
  68. {
  69. if ( FCKBrowserInfo.IsIE )
  70. FCKTools.AddEventListenerEx( element, 'contextmenu', FCKContextMenu_AttachedElement_OnContextMenu, this ) ;
  71. else
  72. element._FCKContextMenu = this ;
  73. }
  74. function FCKContextMenu_Document_OnContextMenu( e )
  75. {
  76. var el = e.target ;
  77. while ( el )
  78. {
  79. if ( el._FCKContextMenu )
  80. {
  81. if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
  82. return true ;
  83. FCKTools.CancelEvent( e ) ;
  84. FCKContextMenu_AttachedElement_OnContextMenu( e, el._FCKContextMenu, el ) ;
  85. return false ;
  86. }
  87. el = el.parentNode ;
  88. }
  89. return true ;
  90. }
  91. var FCKContextMenu_OverrideButton ;
  92. function FCKContextMenu_Document_OnMouseDown( e )
  93. {
  94. if( !e || e.button != 2 )
  95. return false ;
  96. var el = e.target ;
  97. while ( el )
  98. {
  99. if ( el._FCKContextMenu )
  100. {
  101. if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
  102. return true ;
  103. var overrideButton = FCKContextMenu_OverrideButton ;
  104. if( !overrideButton )
  105. {
  106. var doc = e.target.ownerDocument ;
  107. overrideButton = FCKContextMenu_OverrideButton = doc.createElement('input') ;
  108. overrideButton.type = 'button' ;
  109. var buttonHolder = doc.createElement('p') ;
  110. doc.body.appendChild( buttonHolder ) ;
  111. buttonHolder.appendChild( overrideButton ) ;
  112. }
  113. overrideButton.style.cssText = 'position:absolute;top:' + ( e.clientY - 2 ) + 
  114. 'px;left:' + ( e.clientX - 2 ) + 
  115. 'px;width:5px;height:5px;opacity:0.01' ;
  116. }
  117. el = el.parentNode ;
  118. }
  119. return false ;
  120. }
  121. function FCKContextMenu_Document_OnMouseUp( e )
  122. {
  123. var overrideButton = FCKContextMenu_OverrideButton ;
  124. if ( overrideButton )
  125. {
  126. var parent = overrideButton.parentNode ;
  127. parent.parentNode.removeChild( parent ) ;
  128. FCKContextMenu_OverrideButton = undefined ;
  129. if( e && e.button == 2 )
  130. {
  131. FCKContextMenu_Document_OnContextMenu( e ) ;
  132. return false ;
  133. }
  134. }
  135. }
  136. function FCKContextMenu_AttachedElement_OnContextMenu( ev, fckContextMenu, el )
  137. {
  138. if ( fckContextMenu.CtrlDisable && ( ev.ctrlKey || ev.metaKey ) )
  139. return true ;
  140. var eTarget = el || this ;
  141. if ( fckContextMenu.OnBeforeOpen )
  142. fckContextMenu.OnBeforeOpen.call( fckContextMenu, eTarget ) ;
  143. if ( fckContextMenu._MenuBlock.Count() == 0 )
  144. return false ;
  145. if ( fckContextMenu._Redraw )
  146. {
  147. fckContextMenu._MenuBlock.Create( fckContextMenu._Panel.MainNode ) ;
  148. fckContextMenu._Redraw = false ;
  149. }
  150. // This will avoid that the content of the context menu can be dragged in IE
  151. // as the content of the panel is recreated we need to do it every time
  152. FCKTools.DisableSelection( fckContextMenu._Panel.Document.body ) ;
  153. var x = 0 ;
  154. var y = 0 ;
  155. if ( FCKBrowserInfo.IsIE )
  156. {
  157. x = ev.screenX ;
  158. y = ev.screenY ;
  159. }
  160. else if ( FCKBrowserInfo.IsSafari )
  161. {
  162. x = ev.clientX ;
  163. y = ev.clientY ;
  164. }
  165. else
  166. {
  167. x = ev.pageX ;
  168. y = ev.pageY ;
  169. }
  170. fckContextMenu._Panel.Show( x, y, ev.currentTarget || null ) ;
  171. return false ;
  172. }
  173. function FCKContextMenu_MenuBlock_OnClick( menuItem, contextMenu )
  174. {
  175. contextMenu._Panel.Hide() ;
  176. FCKTools.RunFunction( contextMenu.OnItemClick, contextMenu, menuItem ) ;
  177. }