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

数据库编程

开发平台:

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.  * Definition of other commands that are not available internaly in the
  22.  * browser (see FCKNamedCommand).
  23.  */
  24. // ### General Dialog Box Commands.
  25. var FCKDialogCommand = function( name, title, url, width, height, getStateFunction, getStateParam )
  26. {
  27. this.Name = name ;
  28. this.Title = title ;
  29. this.Url = url ;
  30. this.Width = width ;
  31. this.Height = height ;
  32. this.GetStateFunction = getStateFunction ;
  33. this.GetStateParam = getStateParam ;
  34. this.Resizable = false ;
  35. }
  36. FCKDialogCommand.prototype.Execute = function()
  37. {
  38. FCKDialog.OpenDialog( 'FCKDialog_' + this.Name , this.Title, this.Url, this.Width, this.Height, null, null, this.Resizable ) ;
  39. }
  40. FCKDialogCommand.prototype.GetState = function()
  41. {
  42. if ( this.GetStateFunction )
  43. return this.GetStateFunction( this.GetStateParam ) ;
  44. else
  45. return FCK_TRISTATE_OFF ;
  46. }
  47. // Generic Undefined command (usually used when a command is under development).
  48. var FCKUndefinedCommand = function()
  49. {
  50. this.Name = 'Undefined' ;
  51. }
  52. FCKUndefinedCommand.prototype.Execute = function()
  53. {
  54. alert( FCKLang.NotImplemented ) ;
  55. }
  56. FCKUndefinedCommand.prototype.GetState = function()
  57. {
  58. return FCK_TRISTATE_OFF ;
  59. }
  60. // ### FormatBlock
  61. var FCKFormatBlockCommand = function()
  62. {}
  63. FCKFormatBlockCommand.prototype = 
  64. {
  65. Name : 'FormatBlock',
  66. Execute : FCKStyleCommand.prototype.Execute,
  67. GetState : function()
  68. {
  69. return FCK.EditorDocument ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
  70. }
  71. };
  72. // ### FontName
  73. var FCKFontNameCommand = function()
  74. {}
  75. FCKFontNameCommand.prototype = 
  76. {
  77. Name : 'FontName',
  78. Execute : FCKStyleCommand.prototype.Execute,
  79. GetState : FCKFormatBlockCommand.prototype.GetState
  80. };
  81. // ### FontSize
  82. var FCKFontSizeCommand = function()
  83. {}
  84. FCKFontSizeCommand.prototype = 
  85. {
  86. Name : 'FontSize',
  87. Execute : FCKStyleCommand.prototype.Execute,
  88. GetState : FCKFormatBlockCommand.prototype.GetState
  89. };
  90. // ### Preview
  91. var FCKPreviewCommand = function()
  92. {
  93. this.Name = 'Preview' ;
  94. }
  95. FCKPreviewCommand.prototype.Execute = function()
  96. {
  97.      FCK.Preview() ;
  98. }
  99. FCKPreviewCommand.prototype.GetState = function()
  100. {
  101. return FCK_TRISTATE_OFF ;
  102. }
  103. // ### Save
  104. var FCKSaveCommand = function()
  105. {
  106. this.Name = 'Save' ;
  107. }
  108. FCKSaveCommand.prototype.Execute = function()
  109. {
  110. // Get the linked field form.
  111. var oForm = FCK.GetParentForm() ;
  112. if ( typeof( oForm.onsubmit ) == 'function' )
  113. {
  114. var bRet = oForm.onsubmit() ;
  115. if ( bRet != null && bRet === false )
  116. return ;
  117. }
  118. // Submit the form.
  119. // If there's a button named "submit" then the form.submit() function is masked and
  120. // can't be called in Mozilla, so we call the click() method of that button.
  121. if ( typeof( oForm.submit ) == 'function' )
  122. oForm.submit() ;
  123. else
  124. oForm.submit.click() ;
  125. }
  126. FCKSaveCommand.prototype.GetState = function()
  127. {
  128. return FCK_TRISTATE_OFF ;
  129. }
  130. // ### NewPage
  131. var FCKNewPageCommand = function()
  132. {
  133. this.Name = 'NewPage' ;
  134. }
  135. FCKNewPageCommand.prototype.Execute = function()
  136. {
  137. FCKUndo.SaveUndoStep() ;
  138. FCK.SetData( '' ) ;
  139. FCKUndo.Typing = true ;
  140. FCK.Focus() ;
  141. }
  142. FCKNewPageCommand.prototype.GetState = function()
  143. {
  144. return FCK_TRISTATE_OFF ;
  145. }
  146. // ### Source button
  147. var FCKSourceCommand = function()
  148. {
  149. this.Name = 'Source' ;
  150. }
  151. FCKSourceCommand.prototype.Execute = function()
  152. {
  153. if ( FCKConfig.SourcePopup ) // Until v2.2, it was mandatory for FCKBrowserInfo.IsGecko.
  154. {
  155. var iWidth = FCKConfig.ScreenWidth * 0.65 ;
  156. var iHeight = FCKConfig.ScreenHeight * 0.65 ;
  157. FCKDialog.OpenDialog( 'FCKDialog_Source', FCKLang.Source, 'dialog/fck_source.html', iWidth, iHeight, null, null, true ) ;
  158. }
  159. else
  160.     FCK.SwitchEditMode() ;
  161. }
  162. FCKSourceCommand.prototype.GetState = function()
  163. {
  164. return ( FCK.EditMode == FCK_EDITMODE_WYSIWYG ? FCK_TRISTATE_OFF : FCK_TRISTATE_ON ) ;
  165. }
  166. // ### Undo
  167. var FCKUndoCommand = function()
  168. {
  169. this.Name = 'Undo' ;
  170. }
  171. FCKUndoCommand.prototype.Execute = function()
  172. {
  173. FCKUndo.Undo() ;
  174. }
  175. FCKUndoCommand.prototype.GetState = function()
  176. {
  177. return ( FCKUndo.CheckUndoState() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ) ;
  178. }
  179. // ### Redo
  180. var FCKRedoCommand = function()
  181. {
  182. this.Name = 'Redo' ;
  183. }
  184. FCKRedoCommand.prototype.Execute = function()
  185. {
  186. FCKUndo.Redo() ;
  187. }
  188. FCKRedoCommand.prototype.GetState = function()
  189. {
  190. return ( FCKUndo.CheckRedoState() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ) ;
  191. }
  192. // ### Page Break
  193. var FCKPageBreakCommand = function()
  194. {
  195. this.Name = 'PageBreak' ;
  196. }
  197. FCKPageBreakCommand.prototype.Execute = function()
  198. {
  199. // Take an undo snapshot before changing the document
  200. FCKUndo.SaveUndoStep() ;
  201. // var e = FCK.EditorDocument.createElement( 'CENTER' ) ;
  202. // e.style.pageBreakAfter = 'always' ;
  203. // Tidy was removing the empty CENTER tags, so the following solution has
  204. // been found. It also validates correctly as XHTML 1.0 Strict.
  205. var e = FCK.EditorDocument.createElement( 'DIV' ) ;
  206. e.style.pageBreakAfter = 'always' ;
  207. e.innerHTML = '<span style="DISPLAY:none">&nbsp;</span>' ;
  208. var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', e ) ;
  209. FCK.InsertElement( oFakeImage ) ;
  210. }
  211. FCKPageBreakCommand.prototype.GetState = function()
  212. {
  213. return 0 ; // FCK_TRISTATE_OFF
  214. }
  215. // FCKUnlinkCommand - by Johnny Egeland (johnny@coretrek.com)
  216. var FCKUnlinkCommand = function()
  217. {
  218. this.Name = 'Unlink' ;
  219. }
  220. FCKUnlinkCommand.prototype.Execute = function()
  221. {
  222. // Take an undo snapshot before changing the document
  223. FCKUndo.SaveUndoStep() ;
  224. if ( FCKBrowserInfo.IsGeckoLike )
  225. {
  226. var oLink = FCK.Selection.MoveToAncestorNode( 'A' ) ;
  227. // The unlink command can generate a span in Firefox, so let's do it our way. See #430
  228. if ( oLink )
  229. FCKTools.RemoveOuterTags( oLink ) ;
  230. return ;
  231. }
  232. FCK.ExecuteNamedCommand( this.Name ) ;
  233. }
  234. FCKUnlinkCommand.prototype.GetState = function()
  235. {
  236. var state = FCK.GetNamedCommandState( this.Name ) ;
  237. // Check that it isn't an anchor
  238. if ( state == FCK_TRISTATE_OFF && FCK.EditMode == FCK_EDITMODE_WYSIWYG )
  239. {
  240. var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
  241. var bIsAnchor = ( oLink && oLink.name.length > 0 && oLink.href.length == 0 ) ;
  242. if ( bIsAnchor )
  243. state = FCK_TRISTATE_DISABLED ;
  244. }
  245. return state ;
  246. }
  247. // FCKSelectAllCommand
  248. var FCKSelectAllCommand = function()
  249. {
  250. this.Name = 'SelectAll' ;
  251. }
  252. FCKSelectAllCommand.prototype.Execute = function()
  253. {
  254. if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
  255. {
  256. FCK.ExecuteNamedCommand( 'SelectAll' ) ;
  257. }
  258. else
  259. {
  260. // Select the contents of the textarea
  261. var textarea = FCK.EditingArea.Textarea ;
  262. if ( FCKBrowserInfo.IsIE )
  263. {
  264. textarea.createTextRange().execCommand( 'SelectAll' ) ;
  265. }
  266. else
  267. {
  268. textarea.selectionStart = 0 ;
  269. textarea.selectionEnd = textarea.value.length ;
  270. }
  271. textarea.focus() ;
  272. }
  273. }
  274. FCKSelectAllCommand.prototype.GetState = function()
  275. {
  276. return FCK_TRISTATE_OFF ;
  277. }
  278. // FCKPasteCommand
  279. var FCKPasteCommand = function()
  280. {
  281. this.Name = 'Paste' ;
  282. }
  283. FCKPasteCommand.prototype =
  284. {
  285. Execute : function()
  286. {
  287. if ( FCKBrowserInfo.IsIE )
  288. FCK.Paste() ;
  289. else
  290. FCK.ExecuteNamedCommand( 'Paste' ) ;
  291. },
  292. GetState : function()
  293. {
  294. return FCK.GetNamedCommandState( 'Paste' ) ;
  295. }
  296. } ;
  297. // FCKRuleCommand
  298. var FCKRuleCommand = function()
  299. {
  300. this.Name = 'Rule' ;
  301. }
  302. FCKRuleCommand.prototype =
  303. {
  304. Execute : function()
  305. {
  306. FCKUndo.SaveUndoStep() ;
  307. FCK.InsertElement( 'hr' ) ;
  308. },
  309. GetState : function()
  310. {
  311. return FCK.GetNamedCommandState( 'InsertHorizontalRule' ) ;
  312. }
  313. } ;
  314. // FCKCopyCommand
  315. var FCKCopyCommand = function()
  316. {
  317. this.Name = 'Copy' ;
  318. }
  319. FCKCopyCommand.prototype = 
  320. {
  321. Execute : function()
  322. {
  323. FCK.ExecuteNamedCommand( this.Name ) ;
  324. },
  325. GetState : function()
  326. {
  327. // Strangely, the cut command happens to have the correct states for both Copy and Cut in all browsers.
  328. return FCK.GetNamedCommandState( 'Cut' ) ;
  329. }
  330. };
  331. var FCKAnchorDeleteCommand = function()
  332. {
  333. this.Name = 'AnchorDelete' ;
  334. }
  335. FCKAnchorDeleteCommand.prototype = 
  336. {
  337. Execute : function()
  338. {
  339. if (FCK.Selection.GetType() == 'Control')
  340. {
  341. FCK.Selection.Delete();
  342. }
  343. else
  344. {
  345. var oFakeImage = FCK.Selection.GetSelectedElement() ;
  346. if ( oFakeImage )
  347. {
  348. if ( oFakeImage.tagName == 'IMG' && oFakeImage.getAttribute('_fckanchor') )
  349. oAnchor = FCK.GetRealElement( oFakeImage ) ;
  350. else
  351. oFakeImage = null ;
  352. }
  353. //Search for a real anchor
  354. if ( !oFakeImage )
  355. {
  356. oAnchor = FCK.Selection.MoveToAncestorNode( 'A' ) ;
  357. if ( oAnchor )
  358. FCK.Selection.SelectNode( oAnchor ) ;
  359. }
  360. // If it's also a link, then just remove the name and exit
  361. if ( oAnchor.href.length != 0 )
  362. {
  363. oAnchor.removeAttribute( 'name' ) ;
  364. // Remove temporary class for IE
  365. if ( FCKBrowserInfo.IsIE )
  366. oAnchor.className = oAnchor.className.replace( FCKRegexLib.FCK_Class, '' ) ;
  367. return ;
  368. }
  369. // We need to remove the anchor
  370. // If we got a fake image, then just remove it and we're done
  371. if ( oFakeImage )
  372. {
  373. oFakeImage.parentNode.removeChild( oFakeImage ) ;
  374. return ;
  375. }
  376. // Empty anchor, so just remove it
  377. if ( oAnchor.innerHTML.length == 0 )
  378. {
  379. oAnchor.parentNode.removeChild( oAnchor ) ;
  380. return ;
  381. }
  382. // Anchor with content, leave the content
  383. FCKTools.RemoveOuterTags( oAnchor ) ;
  384. }
  385. if ( FCKBrowserInfo.IsGecko )
  386. FCK.Selection.Collapse( true ) ;
  387. },
  388. GetState : function()
  389. {
  390. return FCK.GetNamedCommandState( 'Unlink') ;
  391. }
  392. };