fckcontextmenu.js
上传用户:dbstep
上传日期:2022-08-06
资源大小:2803k
文件大小:6k
源码类别:

WEB源码(ASP,PHP,...)

开发平台:

ASP/ASPX

  1. /*
  2.  * FCKeditor - The text editor for Internet - http://www.fckeditor.net
  3.  * Copyright (C) 2003-2009 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.SkinEditorCSS ) ;
  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. /**
  52.  The customData parameter is just a value that will be send to the command that is executed,
  53.  so it's possible to reuse the same command for several items just by assigning different data for each one.
  54. */
  55. FCKContextMenu.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
  56. {
  57. var oItem = this._MenuBlock.AddItem( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
  58. this._Redraw = true ;
  59. return oItem ;
  60. }
  61. FCKContextMenu.prototype.AddSeparator = function()
  62. {
  63. this._MenuBlock.AddSeparator() ;
  64. this._Redraw = true ;
  65. }
  66. FCKContextMenu.prototype.RemoveAllItems = function()
  67. {
  68. this._MenuBlock.RemoveAllItems() ;
  69. this._Redraw = true ;
  70. }
  71. FCKContextMenu.prototype.AttachToElement = function( element )
  72. {
  73. if ( FCKBrowserInfo.IsIE )
  74. FCKTools.AddEventListenerEx( element, 'contextmenu', FCKContextMenu_AttachedElement_OnContextMenu, this ) ;
  75. else
  76. element._FCKContextMenu = this ;
  77. }
  78. function FCKContextMenu_Document_OnContextMenu( e )
  79. {
  80. if ( FCKConfig.BrowserContextMenu )
  81. return true ;
  82. var el = e.target ;
  83. while ( el )
  84. {
  85. if ( el._FCKContextMenu )
  86. {
  87. if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
  88. return true ;
  89. FCKTools.CancelEvent( e ) ;
  90. FCKContextMenu_AttachedElement_OnContextMenu( e, el._FCKContextMenu, el ) ;
  91. return false ;
  92. }
  93. el = el.parentNode ;
  94. }
  95. return true ;
  96. }
  97. var FCKContextMenu_OverrideButton ;
  98. function FCKContextMenu_Document_OnMouseDown( e )
  99. {
  100. if( !e || e.button != 2 )
  101. return false ;
  102. if ( FCKConfig.BrowserContextMenu )
  103. return true ;
  104. var el = e.target ;
  105. while ( el )
  106. {
  107. if ( el._FCKContextMenu )
  108. {
  109. if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
  110. return true ;
  111. var overrideButton = FCKContextMenu_OverrideButton ;
  112. if( !overrideButton )
  113. {
  114. var doc = FCKTools.GetElementDocument( e.target ) ;
  115. overrideButton = FCKContextMenu_OverrideButton = doc.createElement('input') ;
  116. overrideButton.type = 'button' ;
  117. var buttonHolder = doc.createElement('p') ;
  118. doc.body.appendChild( buttonHolder ) ;
  119. buttonHolder.appendChild( overrideButton ) ;
  120. }
  121. overrideButton.style.cssText = 'position:absolute;top:' + ( e.clientY - 2 ) +
  122. 'px;left:' + ( e.clientX - 2 ) +
  123. 'px;width:5px;height:5px;opacity:0.01' ;
  124. }
  125. el = el.parentNode ;
  126. }
  127. return false ;
  128. }
  129. function FCKContextMenu_Document_OnMouseUp( e )
  130. {
  131. if ( FCKConfig.BrowserContextMenu )
  132. return true ;
  133. var overrideButton = FCKContextMenu_OverrideButton ;
  134. if ( overrideButton )
  135. {
  136. var parent = overrideButton.parentNode ;
  137. parent.parentNode.removeChild( parent ) ;
  138. FCKContextMenu_OverrideButton = undefined ;
  139. if( e && e.button == 2 )
  140. {
  141. FCKContextMenu_Document_OnContextMenu( e ) ;
  142. return false ;
  143. }
  144. }
  145. return true ;
  146. }
  147. function FCKContextMenu_AttachedElement_OnContextMenu( ev, fckContextMenu, el )
  148. {
  149. if ( ( fckContextMenu.CtrlDisable && ( ev.ctrlKey || ev.metaKey ) ) || FCKConfig.BrowserContextMenu )
  150. return true ;
  151. var eTarget = el || this ;
  152. if ( fckContextMenu.OnBeforeOpen )
  153. fckContextMenu.OnBeforeOpen.call( fckContextMenu, eTarget ) ;
  154. if ( fckContextMenu._MenuBlock.Count() == 0 )
  155. return false ;
  156. if ( fckContextMenu._Redraw )
  157. {
  158. fckContextMenu._MenuBlock.Create( fckContextMenu._Panel.MainNode ) ;
  159. fckContextMenu._Redraw = false ;
  160. }
  161. // This will avoid that the content of the context menu can be dragged in IE
  162. // as the content of the panel is recreated we need to do it every time
  163. FCKTools.DisableSelection( fckContextMenu._Panel.Document.body ) ;
  164. var x = 0 ;
  165. var y = 0 ;
  166. if ( FCKBrowserInfo.IsIE )
  167. {
  168. x = ev.screenX ;
  169. y = ev.screenY ;
  170. }
  171. else if ( FCKBrowserInfo.IsSafari )
  172. {
  173. x = ev.clientX ;
  174. y = ev.clientY ;
  175. }
  176. else
  177. {
  178. x = ev.pageX ;
  179. y = ev.pageY ;
  180. }
  181. fckContextMenu._Panel.Show( x, y, ev.currentTarget || null ) ;
  182. return false ;
  183. }
  184. function FCKContextMenu_MenuBlock_OnClick( menuItem, contextMenu )
  185. {
  186. contextMenu._Panel.Hide() ;
  187. FCKTools.RunFunction( contextMenu.OnItemClick, contextMenu, menuItem ) ;
  188. }