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

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.  * FCKSpecialCombo Class: represents a special combo.
  22.  */
  23. var FCKSpecialCombo = function( caption, fieldWidth, panelWidth, panelMaxHeight, parentWindow )
  24. {
  25. // Default properties values.
  26. this.FieldWidth = fieldWidth || 100 ;
  27. this.PanelWidth = panelWidth || 150 ;
  28. this.PanelMaxHeight = panelMaxHeight || 150 ;
  29. this.Label = ' ' ;
  30. this.Caption = caption ;
  31. this.Tooltip = caption ;
  32. this.Style = FCK_TOOLBARITEM_ICONTEXT ;
  33. this.Enabled = true ;
  34. this.Items = new Object() ;
  35. this._Panel = new FCKPanel( parentWindow || window ) ;
  36. this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
  37. this._PanelBox = this._Panel.MainNode.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
  38. this._PanelBox.className = 'SC_Panel' ;
  39. this._PanelBox.style.width = this.PanelWidth + 'px' ;
  40. this._PanelBox.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
  41. this._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0] ;
  42. if ( FCK.IECleanup )
  43. FCK.IECleanup.AddItem( this, FCKSpecialCombo_Cleanup ) ;
  44. // this._Panel.StyleSheet = FCKConfig.SkinPath + 'fck_contextmenu.css' ;
  45. // this._Panel.Create() ;
  46. // this._Panel.PanelDiv.className += ' SC_Panel' ;
  47. // this._Panel.PanelDiv.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
  48. // this._ItemsHolderEl = this._Panel.PanelDiv.getElementsByTagName('TD')[0] ;
  49. }
  50. function FCKSpecialCombo_ItemOnMouseOver()
  51. {
  52. this.className += ' SC_ItemOver' ;
  53. }
  54. function FCKSpecialCombo_ItemOnMouseOut()
  55. {
  56. this.className = this.originalClass ;
  57. }
  58. function FCKSpecialCombo_ItemOnClick( ev, specialCombo, itemId )
  59. {
  60. this.className = this.originalClass ;
  61. specialCombo._Panel.Hide() ;
  62. specialCombo.SetLabel( this.FCKItemLabel ) ;
  63. if ( typeof( specialCombo.OnSelect ) == 'function' )
  64. specialCombo.OnSelect( itemId, this ) ;
  65. }
  66. FCKSpecialCombo.prototype.ClearItems = function ()
  67. {
  68. if ( this.Items )
  69. this.Items = {} ;
  70. var itemsholder = this._ItemsHolderEl ;
  71. while ( itemsholder.firstChild )
  72. itemsholder.removeChild( itemsholder.firstChild ) ;
  73. }
  74. FCKSpecialCombo.prototype.AddItem = function( id, html, label, bgColor )
  75. {
  76. // <div class="SC_Item" onmouseover="this.className='SC_Item SC_ItemOver';" onmouseout="this.className='SC_Item';"><b>Bold 1</b></div>
  77. var oDiv = this._ItemsHolderEl.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
  78. oDiv.className = oDiv.originalClass = 'SC_Item' ;
  79. oDiv.innerHTML = html ;
  80. oDiv.FCKItemLabel = label || id ;
  81. oDiv.Selected = false ;
  82. // In IE, the width must be set so the borders are shown correctly when the content overflows.
  83. if ( FCKBrowserInfo.IsIE )
  84. oDiv.style.width = '100%' ;
  85. if ( bgColor )
  86. oDiv.style.backgroundColor = bgColor ;
  87. FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKSpecialCombo_ItemOnMouseOver ) ;
  88. FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKSpecialCombo_ItemOnMouseOut ) ;
  89. FCKTools.AddEventListenerEx( oDiv, 'click', FCKSpecialCombo_ItemOnClick, [ this, id ] ) ;
  90. this.Items[ id.toString().toLowerCase() ] = oDiv ;
  91. return oDiv ;
  92. }
  93. FCKSpecialCombo.prototype.SelectItem = function( item )
  94. {
  95. if ( typeof item == 'string' )
  96. item = this.Items[ item.toString().toLowerCase() ] ;
  97. if ( item )
  98. {
  99. item.className = item.originalClass = 'SC_ItemSelected' ;
  100. item.Selected = true ;
  101. }
  102. }
  103. FCKSpecialCombo.prototype.SelectItemByLabel = function( itemLabel, setLabel )
  104. {
  105. for ( var id in this.Items )
  106. {
  107. var oDiv = this.Items[id] ;
  108. if ( oDiv.FCKItemLabel == itemLabel )
  109. {
  110. oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ;
  111. oDiv.Selected = true ;
  112. if ( setLabel )
  113. this.SetLabel( itemLabel ) ;
  114. }
  115. }
  116. }
  117. FCKSpecialCombo.prototype.DeselectAll = function( clearLabel )
  118. {
  119. for ( var i in this.Items )
  120. {
  121. if ( !this.Items[i] ) continue;
  122. this.Items[i].className = this.Items[i].originalClass = 'SC_Item' ;
  123. this.Items[i].Selected = false ;
  124. }
  125. if ( clearLabel )
  126. this.SetLabel( '' ) ;
  127. }
  128. FCKSpecialCombo.prototype.SetLabelById = function( id )
  129. {
  130. id = id ? id.toString().toLowerCase() : '' ;
  131. var oDiv = this.Items[ id ] ;
  132. this.SetLabel( oDiv ? oDiv.FCKItemLabel : '' ) ;
  133. }
  134. FCKSpecialCombo.prototype.SetLabel = function( text )
  135. {
  136. text = ( !text || text.length == 0 ) ? '&nbsp;' : text ;
  137. if ( text == this.Label )
  138. return ;
  139. this.Label = text ;
  140. var labelEl = this._LabelEl ;
  141. if ( labelEl )
  142. {
  143. labelEl.innerHTML = text ;
  144. // It may happen that the label is some HTML, including tags. This
  145. // would be a problem because when the user click on those tags, the
  146. // combo will get the selection from the editing area. So we must
  147. // disable any kind of selection here.
  148. FCKTools.DisableSelection( labelEl ) ;
  149. }
  150. }
  151. FCKSpecialCombo.prototype.SetEnabled = function( isEnabled )
  152. {
  153. this.Enabled = isEnabled ;
  154. // In IE it can happen when the page is reloaded that _OuterTable is null, so check its existence
  155. if ( this._OuterTable )
  156. this._OuterTable.className = isEnabled ? '' : 'SC_FieldDisabled' ;
  157. }
  158. FCKSpecialCombo.prototype.Create = function( targetElement )
  159. {
  160. var oDoc = FCKTools.GetElementDocument( targetElement ) ;
  161. var eOuterTable = this._OuterTable = targetElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
  162. eOuterTable.cellPadding = 0 ;
  163. eOuterTable.cellSpacing = 0 ;
  164. eOuterTable.insertRow(-1) ;
  165. var sClass ;
  166. var bShowLabel ;
  167. switch ( this.Style )
  168. {
  169. case FCK_TOOLBARITEM_ONLYICON :
  170. sClass = 'TB_ButtonType_Icon' ;
  171. bShowLabel = false;
  172. break ;
  173. case FCK_TOOLBARITEM_ONLYTEXT :
  174. sClass = 'TB_ButtonType_Text' ;
  175. bShowLabel = false;
  176. break ;
  177. case FCK_TOOLBARITEM_ICONTEXT :
  178. bShowLabel = true;
  179. break ;
  180. }
  181. if ( this.Caption && this.Caption.length > 0 && bShowLabel )
  182. {
  183. var oCaptionCell = eOuterTable.rows[0].insertCell(-1) ;
  184. oCaptionCell.innerHTML = this.Caption ;
  185. oCaptionCell.className = 'SC_FieldCaption' ;
  186. }
  187. // Create the main DIV element.
  188. var oField = FCKTools.AppendElement( eOuterTable.rows[0].insertCell(-1), 'div' ) ;
  189. if ( bShowLabel )
  190. {
  191. oField.className = 'SC_Field' ;
  192. oField.style.width = this.FieldWidth + 'px' ;
  193. oField.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label>&nbsp;</label></td><td class="SC_FieldButton">&nbsp;</td></tr></tbody></table>' ;
  194. this._LabelEl = oField.getElementsByTagName('label')[0] ; // Memory Leak
  195. this._LabelEl.innerHTML = this.Label ;
  196. }
  197. else
  198. {
  199. oField.className = 'TB_Button_Off' ;
  200. //oField.innerHTML = '<span className="SC_FieldCaption">' + this.Caption + '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;">&nbsp;</td></tr></tbody></table>' ;
  201. //oField.innerHTML = '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;">&nbsp;</td></tr></tbody></table>' ;
  202. // Gets the correct CSS class to use for the specified style (param).
  203. oField.innerHTML = '<table title="' + this.Tooltip + '" class="' + sClass + '" cellspacing="0" cellpadding="0" border="0">' +
  204. '<tr>' +
  205. //'<td class="TB_Icon"><img src="' + FCKConfig.SkinPath + 'toolbar/' + this.Command.Name.toLowerCase() + '.gif" width="21" height="21"></td>' +
  206. '<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
  207. '<td class="TB_Text">' + this.Caption + '</td>' +
  208. '<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
  209. '<td class="TB_ButtonArrow"><img src="' + FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif" width="5" height="3"></td>' +
  210. '<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
  211. '</tr>' +
  212. '</table>' ;
  213. }
  214. // Events Handlers
  215. FCKTools.AddEventListenerEx( oField, 'mouseover', FCKSpecialCombo_OnMouseOver, this ) ;
  216. FCKTools.AddEventListenerEx( oField, 'mouseout', FCKSpecialCombo_OnMouseOut, this ) ;
  217. FCKTools.AddEventListenerEx( oField, 'click', FCKSpecialCombo_OnClick, this ) ;
  218. FCKTools.DisableSelection( this._Panel.Document.body ) ;
  219. }
  220. function FCKSpecialCombo_Cleanup()
  221. {
  222. this._LabelEl = null ;
  223. this._OuterTable = null ;
  224. this._ItemsHolderEl = null ;
  225. this._PanelBox = null ;
  226. if ( this.Items )
  227. {
  228. for ( var key in this.Items )
  229. this.Items[key] = null ;
  230. }
  231. }
  232. function FCKSpecialCombo_OnMouseOver( ev, specialCombo )
  233. {
  234. if ( specialCombo.Enabled )
  235. {
  236. switch ( specialCombo.Style )
  237. {
  238. case FCK_TOOLBARITEM_ONLYICON :
  239. this.className = 'TB_Button_On_Over';
  240. break ;
  241. case FCK_TOOLBARITEM_ONLYTEXT :
  242. this.className = 'TB_Button_On_Over';
  243. break ;
  244. case FCK_TOOLBARITEM_ICONTEXT :
  245. this.className = 'SC_Field SC_FieldOver' ;
  246. break ;
  247. }
  248. }
  249. }
  250. function FCKSpecialCombo_OnMouseOut( ev, specialCombo )
  251. {
  252. switch ( specialCombo.Style )
  253. {
  254. case FCK_TOOLBARITEM_ONLYICON :
  255. this.className = 'TB_Button_Off';
  256. break ;
  257. case FCK_TOOLBARITEM_ONLYTEXT :
  258. this.className = 'TB_Button_Off';
  259. break ;
  260. case FCK_TOOLBARITEM_ICONTEXT :
  261. this.className='SC_Field' ;
  262. break ;
  263. }
  264. }
  265. function FCKSpecialCombo_OnClick( e, specialCombo )
  266. {
  267. // For Mozilla we must stop the event propagation to avoid it hiding
  268. // the panel because of a click outside of it.
  269. // if ( e )
  270. // {
  271. // e.stopPropagation() ;
  272. // FCKPanelEventHandlers.OnDocumentClick( e ) ;
  273. // }
  274. if ( specialCombo.Enabled )
  275. {
  276. var oPanel = specialCombo._Panel ;
  277. var oPanelBox = specialCombo._PanelBox ;
  278. var oItemsHolder = specialCombo._ItemsHolderEl ;
  279. var iMaxHeight = specialCombo.PanelMaxHeight ;
  280. if ( specialCombo.OnBeforeClick )
  281. specialCombo.OnBeforeClick( specialCombo ) ;
  282. // This is a tricky thing. We must call the "Load" function, otherwise
  283. // it will not be possible to retrieve "oItemsHolder.offsetHeight" (IE only).
  284. if ( FCKBrowserInfo.IsIE )
  285. oPanel.Preload( 0, this.offsetHeight, this ) ;
  286. if ( oItemsHolder.offsetHeight > iMaxHeight )
  287. // {
  288. oPanelBox.style.height = iMaxHeight + 'px' ;
  289. // if ( FCKBrowserInfo.IsGecko )
  290. // oPanelBox.style.overflow = '-moz-scrollbars-vertical' ;
  291. // }
  292. else
  293. oPanelBox.style.height = '' ;
  294. // oPanel.PanelDiv.style.width = specialCombo.PanelWidth + 'px' ;
  295. oPanel.Show( 0, this.offsetHeight, this ) ;
  296. }
  297. // return false ;
  298. }
  299. /*
  300. Sample Combo Field HTML output:
  301. <div class="SC_Field" style="width: 80px;">
  302. <table width="100%" cellpadding="0" cellspacing="0" style="table-layout: fixed;">
  303. <tbody>
  304. <tr>
  305. <td class="SC_FieldLabel"><label>&nbsp;</label></td>
  306. <td class="SC_FieldButton">&nbsp;</td>
  307. </tr>
  308. </tbody>
  309. </table>
  310. </div>
  311. */